当我尝试在ng-repeat
中订购我绑定的属性时,我收到$digest
错误。
我认为它正在发生,因为在一个摘要中ng-model
值正在更新,这会影响父orderBy
子句。我不知道怎么解决这个问题。
这表明问题正在发生。一定要打开控制台!
http://embed.plnkr.co/rGLagq/preview
var options = [
{
name: 'test',
isSelected: true
},
{
name: 'another test',
isSelected: false
}
];
<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
答案 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);
};
});
}
});