<分区>
我有一个自定义过滤器,它接收一个对象 subjectBin,并返回一个全新的对象 result。过滤器从 ng-repeat 调用。我的自定义过滤器有效,但会引发无限 $digest 错误。这是我的过滤器:
return function(subjectBin, field) {
var result = {},
faculty,
subject;
angular.forEach(subjectBin, function (value, key) {
faculty = key;
angular.forEach(value, function (value, key) {
subject = key;
value.forEach(function (course) {
// Check "field" against some of the object's properties
//
if (course.asString.toUpperCase().indexOf(field) > -1 ||
course.subjectTitle.toUpperCase().indexOf(field) > -1 ||
faculty.toUpperCase().indexOf(field) > -1 ) {
if (result.hasOwnProperty(faculty)) {
if (result[faculty].hasOwnProperty(subject)) {
result[faculty][subject].push(course);
}
else {
result[faculty][subject] = [course];
}
}
else {
result[faculty] = {};
result[faculty][subject] = {};
result[faculty][subject] = [course];
}
}
});
});
});
return result;
};
根据我的理解,这会产生无限的 $digest 错误,因为每次 $digest 循环发生时我的过滤器都会返回一个全新的对象。这导致脏位被再次设置,一次又一次......
但是当我看到这样的例子时我会感到困惑:
.filter('reverse', function() {
return function(input, uppercase) {
input = input || '';
var out = "";
for (var i = 0; i < input.length; i++) {
out = input.charAt(i) + out;
}
// conditional based on optional argument
if (uppercase) {
out = out.toUpperCase();
}
return out;
};
})
这是来自 Angular 文档的示例,它显然接受了input 并返回了一个全新的字符串out。它还不会抛出任何无限$digest错误。在我看来,这类似于我的过滤器,因为它返回一个全新的对象。
关于为什么我的过滤器抛出无限 $digest 错误,但另一个过滤器却没有抛出的任何见解?