Javascript 无法使用angular.element在ng repeat内进行选择

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

对于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.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);