在angularjs中的非范围变量上添加监视

时间:2015-04-15 06:47:42

标签: javascript angularjs angularjs-directive angularjs-scope

有没有办法将监视添加到非范围变量。我想为本地变量添加一个监视。我有类似的东西

 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吗? 我知道如何使用范围变量,但我有必须检查许多复杂变量的情况。

3 个答案:

答案 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...
});