$last是否意味着已经渲染了ng个重复元素
Does $last mean that ng-repeat elements are already rendered?
问题
if(scope.$last)
{
//get container height
}
我一直在想,这是获得容器高度的正确方法,容器内有ng个重复的元素。我得出的结论是,这不是一个恰当的方法。
看看我的指令:
AdminApp.directive("ngExpander", function($rootScope, $timeout){
var GetProperContainerHeight = function(container, content){
var container = $(container);
var content = $(content);
container.height(content.outerHeight());
return container.height();
}
return{
restrict:'A',
link:function(scope, elem, attr){
if(scope.$last){
$timeout(function(){
$rootScope.ContainerHeight = GetProperContainerHeight(attr.container, attr.content);
}, 500);
}
}
}
});
如果我没有添加$timeout,该指令就不会正常工作,因为它不会返回正确的容器高度(当时我获得了一些负值)。
背景
指令在此有效:
<div class="SwitchContent" data-ng-show="ShowContent" id="testId">
<div class="user-list-element"
data-ng-repeat="user in UserList | filter:userFilter track by $index"
data-ng-click="GetUserDetails(user);"
data-ng-expander
data-container="div.UserPanel"
data-content="div[id=testId]">
<i class="fa fa-user fa-lg padding-r-10"></i> {{ user.name + ' ' + user.surname }}
</div>
</div>
如果没有$timeout,我如何才能获得正确的结果?
您不能在没有超时的情况下执行此操作,因为在编译指令后会异步进行角度渲染。但你不需要的是一个你可能不喜欢的数字500。
只需使用不带第二个参数的$timeout
。
$timeout(function(){
$rootScope.ContainerHeight = SetProperContainerHeight(attr.container, attr.content);
});
这会毫不延迟地将任务放入浏览器队列中。从浏览器停止渲染到超时开始,您仍有一段时间,但这是最接近的。
编辑
问题可能出在您的scope.$last
方法中。代替if(scope.$last){
,您可以做的是观看HTML内容:
link:function(scope, elem, attr){
scope.$watch(function() {
return elem.html();
}, function() {
$timeout(function(){
$rootScope.ContainerHeight = GetProperContainerHeight(attr.container, attr.content);
});
});
}
虽然它看起来很难看,但对我来说总是有效的。每当元素的HTML被更改时(只要ng-repeat
更改了元素的内部内容),就会发生观察者事件。
这里仍然需要一个超时,因为HTML已经更改,但还没有呈现,所以需要将它放入带有超时的异步浏览器队列中。
这还有另一个优点:当前高度总是反映在rootScope属性中,而方法在指令加载时只会执行一次。
相关文章:
- 正在ng重复元素上添加事件
- Ng隐藏在Ng-click元素之外
- 混合元素的有角度的ng重复
- 无法使以下ng on click outside指令在同一页面上的两个元素上工作
- 是否可以在第n个元素处重复启动ng
- AngularJs的ng-click$事件将子元素作为目标传递
- 他们是如何使用angular/jqLite find()方法按属性名称和值选择元素的?ng conf 2015
- 根据特定条件使用ng显示/ng隐藏来显示/隐藏元素
- 在 ng-if 编译后访问指令中的 DOM 元素
- 如何在更改时显示ng个重复元素的总和
- 隐藏元素直到加载完成(ng斗篷不是我需要的)
- 使用 ng-repeat访问 ng 表单元素/值
- 需要在量角器中找到使用ng中继器的li元素的数量
- 当在ng视图中加载新路由时,Tabbing(tabindex)针对错误的元素
- 列出每行2个元素的最佳方式是按角度重复ng
- 如何在使用Protractor测试时找到ng中继器的最后一个元素
- 如何在AnglujarJS ng中继器中选择特定元素
- angular元素在通过ng类添加类时不起作用
- ng重复向一个元素添加条件类
- AngularJS:根据其他对象预先选择ng repeat中的select元素