有没有办法将监视添加到非范围变量。我想为本地变量添加一个监视。我有类似的东西
function EditAssetRegistryController(assetregistryService, manufacturerService, assettypeService, projectService, $localStorage, $routeParams) {
var vm = this;
vm.manufacturers = [];
vm.projects = [];
vm.asset_types = [];
vm.ch_group_uniq = 'none';
}
这里有一种方法可以将监视添加到vm.ch_group_uniq吗? 我知道如何使用范围变量,但我有必须检查许多复杂变量的情况。
答案 0 :(得分:20)
嗯,你可以通过传递一个函数作为第一个参数,轻松地为任何添加一个手表:
$scope.$watch(function watchFunction(scope) {
return vm.ch_group_uniq
}, handler)
要考虑的一些事项:如果没有任何更改,watchFunction
必须返回相同的值。这可能导致一些陷阱,例如,返回一些数组操作的结果:[1,2,3].filter(...)
将始终返回一个新数组,并导致无休止的$digest
循环。另请注意$scope.$watch
的第三个参数,它指示是否使用身份比较,或者在比较值时使用angular.equals
。 (查看文档以获取更多信息 - https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$watch)
但是,您的具体问题似乎是尝试使用controllerAs
和自定义$watch
- es。有一个非常方便的库,专门解决了这个问题:https://github.com/christopherthielen/angular-360-no-scope
答案 1 :(得分:9)
$watch
将无法作为controllerAs
的常规语法。您需要将其绑定到$scope
,然后您可以观察该变量:
<强>代码强>
$scope.$watch(angular.bind(this, function (ch_group_uniq) {
return this.ch_group_uniq;
}), function (newVal, oldVal) {
console.log('Name changed to ' + newVal);
});
以下是参考Todd Motto Article
答案 2 :(得分:1)
使用ES6的清洁语法
$scope.$watch(() => {
return this.thingToWatch;
}, (newVal, oldVal) => {
// Your code here...
});