Javascript 无法使用angular.element在ng repeat内进行选择
对于ngRepeat元素,我有以下HTML:Javascript 无法使用angular.element在ng repeat内进行选择,javascript,jquery,html,angularjs,Javascript,Jquery,Html,Angularjs,对于ngRepeat元素,我有以下HTML: <ol id="animationFrame"> <li ng-repeat="animationImage in animationImages" ng-repeat-listener> <img ng-src="{{animationImage.src}}" id="{{animationImage.id}}"> </li> </ol> 其中,$scope.animat
<ol id="animationFrame">
<li ng-repeat="animationImage in animationImages" ng-repeat-listener>
<img ng-src="{{animationImage.src}}" id="{{animationImage.id}}">
</li>
</ol>
其中,$scope.animation.frameImage
向下舍入为整数。我可以看到我使用了正确的选择器(“#animation-image-1”
是最初加载的选择器,例如),当我使用滑块更改$scope.animation.frameImage
时,它工作得非常好
问题是当页面加载时,使用正确选择器返回的angular.element
对象是未定义的。现在,我假设这是因为ng repeat
尚未填充。因此,我为上述HTML中包含的ng repeat listener
添加了以下指令:
.directive('ngRepeatListener', function() {
return function(scope) {
if(scope.$last) {
scope.$emit('NGREPEATCOMPLETE');
}
}
我就这样用它:
$scope.$on('NGREPEATCOMPLETE', function() {
console.log(angular.element('#animation-image-1'));
};
这实际上是在某个时候被调用的(谁知道它是否在正确的时间)
为什么这不起作用?如何修复它?ngRepeat直到渲染阶段才渲染。要通过angular.element()
访问元素,可以使用$evalAsync:
$scope.$evalAsync(function() { angular.element(...);});
$timeout也可以工作,但它会在$timeout之后触发摘要。如果您希望在呈现之后能够访问DOM,并且不希望在呈现之后触发另一个摘要,请使用$evalAsync
[编辑]
正如@maurycy提到的,$timeout还有第二个参数,可以避免触发另一个摘要:
$timeout(function() {...}, 0, false);
好的,我在我的ngCompleteListener
指令中尝试了$timeout
和$scope.$evalAsync
,但都不起作用。这是否意味着必须将其放置在控制器中?另外,每次调用angular.element
时是否都必须这样做?如果是这样的话,这不是最优雅的解决方案…$timeout
还有第三个参数,它是布尔值-默认为true-to call$digest@ArtlyticalMedia同意不优雅。如果您需要操作DOM,我会创建一个指令。@pixelbits您的意思是说我应该创建自己的指令来代替使用
标记?我想在使用Angular时,我仍然需要更多地考虑指令。我在CSS中找到了使用伪选择器的方法,但我仍然认为这是一个很好的问题。
$timeout(function() {...}, 0, false);