There are several options to avoid having to use $watch
when using the controller as
syntax.
The following examples are taken from a blog post I wrote about avoiding $scope
.
Using ng-change
If you have a watch set up to listen for a property change that
originates from a form field, then ng-change is your best bet.
<input type="text" ng-model="ctrl.name" ng-change="ctrl.search(ctrl.name)" />
MyCtrl.prototype.search = function(name){
//call some service here
};
Using ES5 Properties
If you have some property that isn't bound to an input field, or is
going to be updated from code, it may seem like a watch is your only
choice. However, if you don't have to support IE8 or lower, then you
can take advantage of ES5 properties to trigger functionality when
something changes on your controller.
var MyCtrl = function(){
this._selectedItem = null;
};
Object.defineProperty(MyCtrl.prototype,
"selectedItem", {
get: function () {
return this._selectedItem;
},
set: function (newValue) {
this._selectedItem = newValue;
//Call method on update
this.onSelectedItemChange(this._selectedItem);
},
enumerable: true,
configurable: true
});
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…