【问题标题】:Unable to update view on array update in ng-repeat ($scope.$apply() ) does not workUnable to update view on array update in ng-repeat ($scope.$apply() ) 不起作用
【发布时间】:2017-12-23 02:27:46
【问题描述】:

如果数组在函数内部更新,则视图不会更新。虽然,如果我在 array.push 之后 console.log 数组,那么它会显示更新后的数组。我在 $timeout 中尝试过 $scope.apply() 仍然不起作用。

JavaScript

$scope.openQuestions = [];

$scope.openQuestions.push({value: '1', question: 'abc1'});

$timeout(function() {        

  $scope.$apply(function() {            
    $scope.fetchOpen();      
  });

}, 500);

console.log($scope.openQuestions); //shows the updated value

$scope.fetchOpen = function() {
  $scope.openQuestions.push({value: '2', question: 'abc2'});
}

HTML

<ul>
 <li ng-repeat = "question in openQuestions">
 <p>{{question.question}} </p>
 </li>
</ul>

结果:abc1

【问题讨论】:

  • $timeout 服务会自动调用 $apply,所以它是不必要的并且可能会导致Error: $rootScope:inprog Action Already In Progress
  • 您应该检查开发人员控制台日志以查看是否没有错误,因为 georgeawg 正在谈论多余的 $apply 并删除 $apply。
  • 无法验证问题。在这个DEMO on PLNKR 中工作正常。
  • @georgeawg 是的,它在大多数情况下都可以工作,但在不同的机器上它不会工作几次,实际上,该数组只是一个样本我在该数组中有多个对象,长度约为100.
  • @georgeawg 该数组在网络推送通知点击时更新,并在点击后在开发者控制台中显示更新后的数组,但有时它不会更新视图,因此不稳定。

标签: javascript angularjs arrays angularjs-ng-repeat


【解决方案1】:

问题在于Array.prototype.push函数的使用:

 $scope.openQuestions = $scope.openQuestions.push({value: '2', question: 'abc2'});

正如文档中所说:

push() 方法将一个或多个元素添加到数组的末尾,并且 返回数组的新长度。

它返回数组的长度,你把它放在保存数组的引用变量中并有效地超出它。

相反,只需使用 push 即可,无需再次设置数组:

$scope.fetchOpen = function() {
  $scope.openQuestions.push({value: '2', question: 'abc2'});
}

【讨论】:

  • 感谢@elpddev 的意见,我已经更新了问题,它仍然没有更新HTML
【解决方案2】:

@Sumit Rana 您发布的代码是否与您使用它的方式完全相同,或者您是否为了在此处发布而将其剥离?我问的原因是,我遇到了几乎完全相同的问题,只是我没有使用像你这样的计时器。相反,我有一个简单的函数,它应该只向数组添加一个元素。我正在玩那些工作正常的小提琴。不幸的是,在我的情况下 ng-repeat 没有更新。后来发现原因与我的(相当复杂的)ng-repeat 声明有关:

<tr ng-repeat="cmr in cmrs | orderBy:crit:rev:sortByCrit | filter:{selected:search_selected, ip:search_ip, name:search_name, location:search_location}:false as filtered" class="row-eq-height">

问题是我正在从文件中读取所有属性,“选定”属性除外。我在加载数据后初始化这个属性。不幸的是,我在更改数组后也忘记了做这个初始化。因此,该属性在范围内不存在,我总是得到一个空列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2011-02-14
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多