Angular的watch在使用controllerAs语法时无法工作。
Angular的watch在使用controllerAs语法时无法工作。
出现了观察响应的问题。\n我有一个名为SettingsCtrl的控制器,并且这是我的视图:\n
\n这是我的控制器:\n
app.controller('SettingsCtrl', function ($scope, settingsFactory, Test) { var vm = this; settingsFactory.test().then(function(response){ vm.test = response; }) ///// 或者 vm.test = Test; // 这是来自ui-router的resolve $scope.$watch(angular.bind('vm', function () { return vm.test; }), function (newV, oldV) { console.log(newV, oldV); }); $scope.$watch(function watch(scope){ return vm.test; }), function handle(newV, oldV) { console.log(newV, oldV); }); $scope.$watch('vm', function (newVal, oldVal) { console.log('newVal, oldVal', newVal, oldVal); }); });
\n我一直在搜索并找到了不同的解决方案,但没有一个有效。\n**** 只有在控制器加载时,它才会触发一次观察并显示我的控制台日志,但是当我尝试进行更改时,观察者不起作用。\n我做错了什么?
Angular的watch方法在使用controllerAs语法时无法正常工作的原因是因为无法直接访问控制器的属性。解决方法是使用$scope.$watch来监视控制器的属性,并在回调函数中进行相应的操作。以下是一个例子:
$scope.$watch(function(){ return ctrl.test; },function(newVal,oldVal){ console.log(newVal,oldVal); },true)
通过以上代码,可以在控制器的test属性发生变化时执行回调函数,并打印出新旧值。
如果需要深度监视对象的属性变化,可以使用第三个参数设置为true。这样可以深度遍历对象的所有属性,并在任何属性发生变化时执行回调函数。
参考链接:[watch an object](https://stackoverflow.com/questions/19455501)
希望以上解决方法对您有帮助。
AngularJS中的controllerAs语法与Angular的watch功能不兼容,导致无法正常工作。为了解决这个问题,可以通过将$scope.$watch方法替换为$scope.$watchCollection来实现监视。下面是解决方法的代码示例:
angular .module('app', []) .controller('SettingsCtrl', function() { var vm = this; vm.test = ''; $scope.$watchCollection(function() { return vm.test; }, function(newV, oldV) { if (newV && newV.name && newV.name !== oldV.name) { vm.test.watchedName = newV.name.toUpperCase(); } }); });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app='app'> <div ng-controller='SettingsCtrl as settings'> <input type='text' ng-model='settings.test.name' /> <pre><code> {{ settings.test.watchedName }} </code></pre> </div> </div>
Angular的watch函数在使用controllerAs语法时无法正常工作的原因是,watch函数默认只监视引用的变化,如果只是改变了所监视对象的属性,watch函数是不会被触发的。解决这个问题的方法是在watch函数的最后加上true参数,这样就可以进行深度监视,每当所监视对象的属性发生变化时,watch函数都会被触发。通过添加true参数,可以解决这个问题。
具体的解决方法如下:
$scope.$watch('vm', function (newVal, oldVal) { console.log('newVal, oldVal', newVal, oldVal); }, true);
在这个例子中,vm是要监视的对象,newVal和oldVal分别表示新旧的值。通过在watch函数的第三个参数位置添加true参数,实现了对vm对象属性的深度监视。
非常感谢!我忘记了深度监视,这个方法帮了我大忙。