$ watch焦点丢失了

时间:2015-01-19 10:15:44

标签: angularjs nicescroll

我有textarea标记,附带jquery.nicescroll插件和ng-model。

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

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

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

一切都很好,除了 onTextChange 不仅在我输入内容时被触发,而且当我点击textareaб时,以及当我切换到另一个标签时。

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

使用说明进行演示: plunker

2 个答案:

答案 0 :(得分:2)

这是一个修复:

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

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

所以问题是只要angularjs告诉应用程序消化,watch会触发该函数。你所做的就是告诉它所谓的改变&#39;函数每次都应该通过检查函数来检查发生的变化。它是关于观看&#39;而不是关于&#39;观察变化&#39; - 函数参数应该看看你是否需要做某事。< / p>

额外注意事项:

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

答案 1 :(得分:1)

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