我需要能够在执行特定任务时忽略特定的手表.这是场景.
我在场上有几个观察者用于计算“总计”字段.
可以手动修改所有这些字段,这将触发计算“总计”字段的手表.
这些字段也可以从保存状态加载,这也会触发计算“总计”字段的手表.
“总计”字段也可以手动覆盖,保存和加载.
当手动覆盖“总计”字段与其他字段一起加载时,会发生此问题.重新计算“总计”的手表将被触发,并覆盖手动覆盖的“总计”.
我需要能够在负载发生时忽略手表.有什么办法吗?
我知道可以使用在创建手表时传回的取消注册功能来禁用观察者,但是当您重新创建观察者时仍然知道它正在观看的数据已经改变.
注意:这是围绕该问题的业务逻辑的过于简化的描述.无法禁用手表需要大量工作.
这是一个显示问题的小提琴:jsfiddle.net/vGWZy/1/
解决方法
您可以在特殊服务中存储观察者的回调和禁用,并使用服务方法绑定和解除绑定
代码示例
http://jsfiddle.net/snicksnk/66osj8zm/
//Service for working with watcher's binding var watchService = { watchers: {},create: function(name,callback){ watchService.watchers[name] = { 'callback': callback,'disableCallback': null }; },enable: function($scope,name){ if (typeof watchService.watchers[name]['callback'] !== 'function'){ return; } watchService.disable(name); var watcher = watchService.watchers[name]['callback']; watchService.watchers[name]['disableCallback'] = $scope.$watch(name,watcher,true); },disable: function(name){ if (typeof watchService.watchers[name]['disableCallback'] !== 'function'){ return; } watchService.watchers[name]['disableCallback'](); } }; //Creating of watcher's callbacks,instead of using $scope.$watch directly watchService.create('item.value1',function() { $scope.item.total = $scope.item.value1 * $scope.item.value2; }); watchService.create('item.value2',function() { $scope.item.total = $scope.item.value1 * $scope.item.value2; }); //Wathcers enabler $scope.enableWatchers = function(){ watchService.enable($scope,'item.value1'); watchService.enable($scope,'item.value2'); }; //Wathcers disable $scope.disableWatchers = function(){ watchService.disable('item.value1'); watchService.disable('item.value2'); };