angular度触发器改变$ watch vs ng-change,ng-checked等
目前我们可以通过几种方式监控数据变化。 我们可以使用$watch
触发模型更改,并且可以将指令添加到元素并将某些操作绑定到元素。
在很多情况下有点混乱,所以我很好奇,这是每个变体的优缺点,什么时候应该使用$watch
绑定,以及什么时候像ng-change
一样的指令?
$watch
和ngChange
都有完全不同的用法:
比方说,你有一个范围定义的模型:
$scope.myModel = [ { "foo":"bar" } ];
现在,如果您想在myModel
发生任何更改时执行某些操作,则可以使用$watch
:
$scope.$watch("myModel", function(newValue, oldValue){ // do something });
ngChange
是一个指令,可以在用户更改input时评估给定的expression式:
<select ng-model="selectedOption" ng-options="option for option in options" ng-change="myModel=selectedOption"></select>
总之,您通常ngChange
绑定到某个HTML元素。 而$watch
是模型。
ngChange
指令代码:
var ngChangeDirective = valueFn({ require: 'ngModel', link: function(scope, element, attr, ctrl) { ctrl.$viewChangeListeners.push(function() { scope.$eval(attr.ngChange); }); } });
猜猜看, ngChange
需要ngChange
的控制器,并在视图改变时执行绑定expression式。
所以它就像一个帮手,可以帮助你避免执行繁琐的任务,比如[$ watch'model'then do something]。
从性能的angular度来看,你有一个less$watch
expression担心。
像ng-change
这样的指令用于与DOM的数据绑定。 在您的JS代码中使用$watch
来监听更改。
当您需要让DOM受到范围更改的影响,或者需要更改DOM(例如,字段select)来影响范围时,您可以使用指令。
如果您需要从范围更改(例如ajax请求)触发JavaScript操作,那么您可以在控制器(或服务)中使用$watch
来监听更改。
如果你想双向数据绑定,那么使用ng-model
。 这推动了从模型到视图,从视图到模型的变化 – 两种方式。 但是,如果您只是希望从视图到模型的单向数据绑定,则使用ng-change
。 如果要从模型中进行简单的单向数据绑定查看,则可以使用expression式{{ like_this }}
。 但是,如果您想更多地控制模型在视图中的呈现方式,或者想要将模型绑定到视图之外的其他模型,请使用$watch
。