Javascript AngularJS-在ng repeat完成后操作DOM
在遍历数据之后,我遇到了一些有关DOM操作的问题 我们有一个jQuery slider插件,它绑定到数据并正常工作,但是当使用Javascript AngularJS-在ng repeat完成后操作DOM,javascript,angularjs,ng-repeat,Javascript,Angularjs,Ng Repeat,在遍历数据之后,我遇到了一些有关DOM操作的问题 我们有一个jQuery slider插件,它绑定到数据并正常工作,但是当使用ng repeat时,我们必须用$timeout来包装它的初始化,这样它才能工作——现在甚至不工作了 我认为使用$timeout是不可靠的,这会导致错误的修复。在jQuery中,我可以使用$(document).ready()-这是实心的,但是使用angular.element(document).ready()似乎也不起作用 已调用slider指令,但无法获取滑块中图像
ng repeat
时,我们必须用$timeout
来包装它的初始化,这样它才能工作——现在甚至不工作了
我认为使用$timeout
是不可靠的,这会导致错误的修复。在jQuery中,我可以使用$(document).ready()
-这是实心的,但是使用angular.element(document).ready()
似乎也不起作用
已调用slider指令,但无法获取滑块中图像的高度,因为图像尚未加载到DOM中-导致滑块的计算高度为0
目前我发现这非常令人沮丧-必须有一种方法在数据(例如在ng repeat
中)循环通过后操作DOM
滑块的初始化操作如下所示:
var sliderLoad=函数(){
$timeout(函数(){
var setHeight=elem.find('.slide:eq(0')).outerHeight(true);
元素css({
高度:设置高度
});
}, 1000);
//显示滑块导航按钮
elem.parent().find('.direction nav').show();
};
…这是一个快,弄脏它 我们希望确保所有图像都已加载,因此让我们为此编写一个指令:
app.directive('loadDispatcher',function(){
返回{
限制:“A”,
链接:函数(范围、元素、属性){
元素绑定('load',function()){
作用域。$emit(“$imageLoaded”);
});
}
};
})
…并将其连接到ng src
'd元素:
现在,我们可以将捕获的事件数量与我们的模型进行比较,并根据需要采取行动:
var loadCount=0;
作用域(“$imageLoaded”,函数(){
if(loadCount++==scope.videos.objects.length-1){
_initSlider();//动作!
}
});
将其解耦 这有点令人不安,因为它没有遵守-任何观看
$imageLoaded
事件的指令都必须了解模型(scope.videos.objects.length
)
我们可以通过找出加载了多少图像而不显式寻址模型来防止这种耦合。让我们假设事件将在ng repeat
中处理
ng repeat
已完成,并触发具有项目计数的事件。我们可以通过附加一个唯一用途的控制器来实现这一点,即监视$last
属性。一旦找到它(具有真实值),我们将触发一个事件来通知它:
.controller('LoopWatchCtrl',函数($scope){
$scope.$watch('$last',函数(newVal,oldVal){
newVal&&$scope.$emit(“$repeatFinished”、$scope.$index);
});
})
var loadCount=0,
lastIndex=0;
作用域.$on(“$repeatFinished”,函数(事件、数据){
lastIndex=数据;
});
作用域.$on(“$imageLoaded”,函数(){
if(lastIndex&&loadCount++==lastIndex){
_initSlider(元素);//这是在任何地方定义的
}
});
折叠它 让我们将整个沙邦提取为一个指令:
app.directive('imageLoadWatcher',函数($rootScope){
返回{
限制:“A”,
链接:函数(范围、元素、属性){
if(typeof$rootScope.loadCounter=='undefined'){
$rootScope.loadCounter=0;
}
元素。find('img')。bind('load',function(){
scope.$emit(“$imageLoaded”,$rootScope.loadCounter++);
});
},
控制器:功能($scope){
$scope.$parent.$on(“$imageLoaded”,函数(事件,数据){
如果($scope.$last&&$scope.$index===$rootScope.loadCounter-1){
$scope.$emit(“$allImagesLoaded”);
删除$rootScope.loadCounter;
}
});
}
};
});
…将应用于ng repeat
ed元素:
现在,我们只需在滑块中观看$allImagesLoaded
:
scope.$on('$allImagesLoaded',function(){
_初始滑块(元件);
});
概括它(如果你想的话) 我们可以再次分解它,并在应用程序范围内应用此方法,对任何
ng repeat
finish或ng src
加载使用事件调度,这并不总是必要的(1),但可能非常有用。让我们看看如何:
ng src
指令,以便在加载图像时发送事件:
app.config(函数($provide){
$provide.decorator('ngsrcdirection',函数($delegate){
var指令=$delegate[0],
link=directive.link;
directive.compile=函数(){
返回函数(范围、元素、属性){
应用(这个,参数);
元素绑定('load',function()){
作用域。$emit(“$imageLoaded”);
});
};
};
返回$delegate;
});
// ...
});
ng repeat
以在完成时通知:
app.config(函数($provide){
// ...
$provide.decorator('ngRepeatDirective',函数($delegate){
var指令=$delegate[0],
link=directive.link;
directive.compile=函数(){