$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) 并在此方法中处理文本更改条件。
我有一个 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) 并在此方法中处理文本更改条件。