我有textarea
标记,附带jquery.nicescroll插件和ng-model。
<textarea id="paper" ng-model="paper"></textarea>
在我的代码中,我对此ng-model变量应用$watch
。
$scope.$watch("paper", onTextChange);
一切都很好,除了 onTextChange 不仅在我输入内容时被触发,而且当我点击textareaб时,以及当我切换到另一个标签时。
如何阻止它,以便仅在文本更改时触发 onTextChange ,这意味着当我输入内容或删除字符时?
使用说明进行演示: plunker
答案 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)并处理此方法中的文本更改条件。