在下面的 Angular 1.7.5 代码中,我使用 ng-model
将一个文本框连接到某个 Controller 字段,并使用 $doCheck
做一些事情值变化。请注意,在我的实际项目中,我正在观察的值是一个对象,我需要找出它的任何字段是否发生变化,所以我必须使用 $doCheck
。我知道这对于文本框来说有点矫枉过正。
HTML
<div ng-app="app" ng-controller="TheController as ctrl">
<input ng-model="ctrl.value" />
</div>
JS
angular.module("app", [])
.controller("TheController",
class TheController
{
constructor()
{
this.value = "";
}
$doCheck()
{
console.log("check: " + this.value);
}
}
);
只要文本框中的值发生变化,您就会看到 $doCheck
被调用了两次(两次都使用了新值)。为什么是这样?我怎样才能过滤掉“无意义的”$doCheck
调用,只获取值实际发生变化的调用?
最佳答案
$digest循环不断迭代直到模型稳定,这意味着 $evalAsync队列为空且 $watch列表未检测到任何更改。
这意味着 $doCheck
将调用至少两次。一次检测变化,再次检测没有新的变化。如果 $evalAsync
列表中添加了更多更改或功能。它将被一次又一次地调用到 $rootScopeProvider.digestTtl(limit)
设置的限制。 .
如果检测到变化,您必须存储以前的值以与当前值进行比较。
this.$doCheck = function() {
var newValue;
var oldValue;
oldValue = newValue;
newValue = itemOfInterest();
if (newValue != oldValue) {
//Code to act on changes
};
};
有关详细信息,请参阅
关于javascript - 为什么 $doCheck 在 View 更改时被调用两次,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53971271/