AngularJS orderBy与ngModel相同的属性抛出$ digest错误

时间:2014-11-12 01:53:38

标签: javascript angularjs angularjs-ng-repeat

当我尝试在ng-repeat中订购我绑定的属性时,我收到$digest错误。 我认为它正在发生,因为在一个摘要中ng-model值正在更新,这会影响父orderBy子句。我不知道怎么解决这个问题。

Plunker(更新)

这表明问题正在发生。一定要打开控制台!

http://embed.plnkr.co/rGLagq/preview

JS

var options = [
    {
        name: 'test',
        isSelected: true
    }, 
    {
        name: 'another test',
        isSelected: false
    }
];

HTML

<div ng-repeat="option in options | orderBy:'-isSelected'">
        <label>
             <input type="checkbox"
                    ng-model="option.isSelected"> {{option.name}}
        </label>
    </div>

错误

Error: [$rootScope:inprog] $digest already in progress

3 个答案:

答案 0 :(得分:1)

此问题是由角度错误引起的:

https://github.com/angular/angular.js/issues/10014

希望通过以下方式解决:https://github.com/angular/angular.js/pull/9808

目标修订版本:1.3.4

答案 1 :(得分:0)

确保您的代码中没有手动调用,例如$ scope。$ apply()或$ scope。$ digest,这将手动启动摘要周期。你在这里展示的代码应该没问题。

答案 2 :(得分:0)

当您以编程方式(从Angular中)触发代码(例如DOM事件)时,有时会发生inprog错误,这通常由外部触发器调用。这种错误通常很难处理。最好的办法是使用$ timeout等待摘要完成,然后执行任务。我已修改您的代码以使用$ timeout提供预期的功能。请看下面的代码。要了解有关inprog的更多问题,请参阅此链接

https://docs.angularjs.org/error/ $ rootScope / inprog

HTML

<body ng-controller="MainCtrl">
  <div ng-repeat="option in options | orderBy:'-isSelected'">
    <label>
      <input type="checkbox" ng-click="option.selected()"> {{option.name}}
    </label>
  </div>
</body>

JS

var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope, $timeout) {
    var myScope = $scope;
    myScope.options = [];
    for (var i = 1; i <= 10; i++) {
        myScope.options.push(new function(){
            var myself = this;
            myself.name = 'Tag ' + i;
            myself.isSelected = false;
            myself.selected = function() {
                $timeout(function() {
                    myself.isSelected = !myself.isSelected;
                    myScope.$apply();
                }, 0, false);
            };
        });
    }
});