anchorScroll不在ng-repeat的控制器中执行?

时间:2016-10-05 16:06:58

标签: html angularjs angularjs-ng-repeat ng-repeat anchor-scroll

我认为我已经确定了一些关于ng-repeat运行时间的奇怪的AngularJS1行为,因此与控制器执行的时间冲突。

我的控制器会自动向下滚动到html锚点ID: $ anchorScroll( 'html_id');

这适用于静态html(static html plunker

<div id="hello1">Hello1 </div>

但是如果控制器在ng-repeat(ng-repeat plunker)生成的div上调用anchorScroll似乎不起作用

 <div id="{{ITEM.slug}}" ng-repeat="ITEM in LIST">{{ITEM.slug}}</div>

注意::使用按钮可以正常使用ng-repeat的anchorScroll,但是我想让它在加载时自动滚动...

(我也试过usig ng-init =来调用滚动函数,但同样的时间问题 - 所以它找不到锚...即使在ng-repeat之后编码)

任何想法/解决方法?

(似乎没有任何ng-repeat事件要绑定到......)

1 个答案:

答案 0 :(得分:1)

要使其正常工作,$anchorScroll必须在摘要周期后执行,以便实际呈现项目。

实现这一目标的最简单方法是使用$timeout 0秒延迟,这将创建一个将被解决的承诺。在0延迟时,承诺将在当前摘要周期完成后处理,而不是立即处理。

testApp.controller('testCtrl', function($scope, $anchorScroll, $timeout) {
  $scope.LIST = [{
    "slug": "hello1"
  }, {
    "slug": 'hello2'
  }, {
    "slug": 'hello3'
  }];

  $timeout(function() {
    $anchorScroll('hello3');
  }, 0);
});

https://plnkr.co/edit/53hlGNig7eozlm1vqkQL?p=preview