javascript - 为什么 $doCheck 在 View 更改时被调用两次,我该怎么办?

标签 javascript angularjs

在下面的 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/

相关文章:

javascript - 使用我的代码进行 jQuery 加载事件

javascript - 如何在jquery追加中添加元素

javascript - 仅当在输入字段 ANGULARJS 中键入文本时才发出 http get 请求

javascript - JS to keep css selector hover state on - css animation, 已经尝试了多个答案但没有成功

javascript - Chrome onMessage监听器总是发送 'undefined'响应

c# - 防止IDM在web api中自动下载

javascript - 将具有指定标志图标的网站书签添加到手机主屏幕

javascript - 我可以使用 Angular 将 mouseup 事件绑定(bind)到文档正文吗?

javascript - AngularJS 生成的嵌套列表的行为不符合预期

javascript - Lightgallery 哈希插件中有多个画廊?