angular度触发器改变$ watch vs ng-change,ng-checked等

目前我们可以通过几种方式监控数据变化。 我们可以使用$watch触发模型更改,并且可以将指令添加到元素并将某些操作绑定到元素。

在很多情况下有点混乱,所以我很好奇,这是每个变体的优缺点,什么时候应该使用$watch绑定,以及什么时候像ng-change一样的指令?

$watchngChange都有完全不同的用法:

比方说,你有一个范围定义的模型:

 $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$watchexpression担心。

ng-change这样的指令用于与DOM的数据绑定。 在您的JS代码中使用$watch来监听更改。

当您需要让DOM受到范围更改的影响,或者需要更改DOM(例如,字段select)来影响范围时,您可以使用指令。

如果您需要从范围更改(例如ajax请求)触发JavaScript操作,那么您可以在控制器(或服务)中使用$watch来监听更改。

如果你想双向数据绑定,那么使用ng-model 。 这推动了从模型到视图,从视图到模型的变化 – 两种方式。 但是,如果您只是希望从视图到模型的单向数据绑定,则使用ng-change 。 如果要从模型中进行简单的单向数据绑定查看,则可以使用expression式{{ like_this }} 。 但是,如果您想更多地控制模型在视图中的呈现方式,或者想要将模型绑定到视图之外的其他模型,请使用$watch