Javascript 角度加载和$digest

Javascript 角度加载和$digest,javascript,angularjs,Javascript,Angularjs,我试图使用angular.element获得span元素的长度,但是,我意识到加载angular执行ng repeat需要时间。正因为如此,我没有得到正确的返回长度 我想要完成的是:首先,根据字母的长度显示零的数字。然后随机生成一个0到9的数字。最后,将数字替换为字母的正确位置 HTML文件 <span class="nbr" ng-repeat="(key, value) in letters track by $index">0</span> 我犯了一个错误

我试图使用
angular.element
获得span元素的长度,但是,我意识到加载angular执行
ng repeat
需要时间。正因为如此,我没有得到正确的返回长度

我想要完成的是:首先,根据字母的长度显示零的数字。然后随机生成一个0到9的数字。最后,将数字替换为字母的正确位置

HTML文件

    <span class="nbr" ng-repeat="(key, value) in letters track by $index">0</span>
我犯了一个错误

如果有人能解释angular是如何以及何时加载的,以及为什么会发生这种情况,这将是很有帮助的。 谢谢你

检查工作演示:

添加
$timeout
以等待
$digest
完成:

var app = angular.module('plunker', []);

app.controller('MainCtrl', ['$scope', '$timeout', function($scope, $timeout) {
  $scope.letters = ["H", "E","L", "L","O"];

  $timeout(function () {
    $scope.randomnbr = angular.element(document.querySelectorAll('.nbr'));
    alert($scope.randomnbr.length);
  });

}]);

首先-不要在控制器中进行DOM操作。

之所以发生这种情况,是因为您的控制器首先得到初始化,这将触发ng repeat model作用域变量

要测试它,请将代码包装在$timeout中-这将确保调用在下一个摘要周期中调用的angular.element

app.controller('MainCtrl', function($scope, $timeout) {
  $scope.letters = ["H", "E", "L", "L", "O"];
  $timeout(function() {
    $scope.randomnbr = angular.element(document.querySelectorAll('.nbr'));
    alert($scope.randomnbr.length);
  });
});

更好的处理方法是

这有什么意义?您正在获取一个长度已知的数组,然后试图通过找出写入了多少元素来确定其长度?这一点都不显得有棱角,即使有可行的答案,也没有意义。这只是一段代码,我需要找出如何处理我的其他项目。假设您有一个字符串,并且希望单独显示字母,并且希望以某种方式单独操作字母@你已经有了一个关于如何用非角度的方法来做的答案,但是我仍然认为这根本不是用角度来做的最有效的方法。我认为,如果您发布了特定代码的详细信息,100次中有99次可以在angular中完成您需要完成的任何事情,而无需借助JQuery或
angular.element
,而且您还没有真正证明这一次是必要的。@Claies我编辑了我想要完成的内容,有什么建议吗?我也更新了plunker@克莱斯
app.controller('MainCtrl', function($scope, $timeout) {
  $scope.letters = ["H", "E", "L", "L", "O"];
  $timeout(function() {
    $scope.randomnbr = angular.element(document.querySelectorAll('.nbr'));
    alert($scope.randomnbr.length);
  });
});