$watch 在失去焦点时触发

$watch fires on focus lost

我有一个 textarea 标签,上面附有 jquery.nicescroll 插件和 ng-model。

<textarea id="paper" ng-model="paper"></textarea>

在我的代码中,我在此 ng-model 变量上应用了 $watch

$scope.$watch("paper", onTextChange);

一切都很好,除了 onTextChange 不仅在我输入内容时触发,而且在我从 textareaб 中单击离开时以及在切换到另一个选项卡时触发。

我怎样才能阻止它,以便 onTextChange 仅在文本更改时触发,这意味着当我输入内容或删除字符时?

带说明的演示: plunker

这是一个修复方法:

http://plnkr.co/edit/kycmUrthYU38Ukdz0jJG?p=preview

setTimeout( 
function() {
    $scope.$watch("paper", function(newtext, oldtext) {
      if (newtext !== oldtext) {
        onTextChange();
      }
    });
  }, 100)

所以问题是 watch 会在 angularjs 告诉应用程序消化时触发该功能。你所做的是告诉它每次都调用 'change' 函数,当你应该传入一个检查函数来检查发生的变化时。它是关于 'watching',而不是关于 'watching for changes' - 函数参数应该看看你是否需要做某事。

补充说明:

AngularJS 为各种元素上的各种事物设置观察者 - 这里有更多信息。我相信模糊对应于触发摘要的 ng-touched What gets added to $scope.$$watchers by default in Angular? And what triggers $digests?

使用 setTimeout 是个坏主意。相反,您可以使用 ng-model-options="{ getterSetter: true }" 并将方法写入 get/set 值 (Modified get/set Plunk) 并在此方法中处理文本更改条件。