2013-09-24 59 views
3

所以我有一个指令,当页面加载时将调整内容大小以适应正确的尺寸。然而,当页面加载时有一个服务调用来填充这个特定内容部分的模型,并且当我获得这个元素的高度时,它的大小为0,因为模型在调整大小时没有更新。我试图在页面加载后立即调整大小,以便用户不会注意到在屏幕上移动的元素,但如果在更新模型后决定了元素的大小,则不太可能。动态大小调整和AngularJS模型

有什么方法可以计算消化后部分的高度或获得适当的消化前高度吗?

myApp.directive('resize', function() { 
    return function(scope, element) { 
     var htmlHeight = angular.element("html").height(); 
     var headerHeight = angular.element("#page-header").height(); 
     var dashboardHeight = angular.element(".top-dashboard").height(); // Returns 0 because of pre-loaded data not existing 
     var totalHeight = htmlHeight - headerHeight - dashboardHeight; 
     scope.$on('$viewContentLoaded', function() { 
      element[0].style.height = totalHeight + 'px'; 
     }); 
    } 
}); 

上面有指令的HTML:

<section class="top-dashboard row full" resize> 
    <div class="small-3" ng-include src="'partials/location.html'"></div> 
</section> 

更新1:我觉得做一个决心已预装了会照顾好它的控制器前的数据,但高度仍然返回0.

更新2:也许这是一个更大的问题,因为它是一个包含模板的事实?尤其是看到在超时中包装它根本没有帮助,也没有做出决定。

回答

1

几件事情。不要打扰ng风格,你可以直接访问元素。使用它。此外,你正在观看htmlHeight,它只是一个像素值,但你从来没有把它分配给范围......所以我不确定你在这里做什么,但这不会工作,因为你在看scope.htmlHeight,我没有看到任何地方定义。

调用服务来填充部分的控制器在哪里?这就是你希望$ emit或$广播一个事件让你的指令知道它需要重绘的地方。如果控制器在指令之上,则使用$scope.$broadcast('resizeMe');,否则以相同方式使用$scope.$emit

然后在你的指令,你可以做这样的事情

myApp.directive('resize', ['$timeout', function($timeout) { 
    return function(scope, element) { 
    var $html = angular.element("html"), 
     $header= angular.element("#page-header"), 
     $dash= angular.element(".top-dashboard"); 

    var resize = function(){  
     var totalHeight = $html.height() - $header.height()- $dash.height(); 
     element.style.height = totalHeight + 'px'; 
    } 

    scope.$on('resizeMe', function(){ 
     $timeout(resize); //forces it to wait till the next digest 
    }); 
    } 
}]); 

任何手表或类似的东西在这里没有真正的需要。尽量避免添加手表。

+0

它实际上正在观察那个临时变量,它令人惊讶地发现它。我的猜测会是因为它在我加载带有指令的新html时重新评估指令,重新评估变量并触发$ watch。页面被调用,然后服务被触发并加载动画显示,然后我从服务调用更新模型。调整大小需要足够通用以在所有页面上工作。我不想在每个控制器上复制粘贴广播;其中,美元手表的表现是否超过美元? –

+0

'$ watch'的性能成本大于'$ on'。你可以从你的服务中做你的广播,这将是更通用的。或者,您可以使用javascript来观看'onresize'事件的'small-3'。 –

+0

那么,我实际上试图在控制器加载之前尝试填充模型,希望它会使用更新后的模型信息预先渲染该部分(使用resolve)。不过,我认为模板被编译并放置在DOM中以及模型更新模板/ DOM之间存在脱节,因为无论如何,高度仍然返回0。无论是该事件队列还是事件队列都被作为低优先级摘要。 –