I need to be able to ignore specific watches while performing specific tasks. Here is the scenario.
I have a couple watchers on fields which are being used to calculate a "totals" field.
All of these fields can be manually modified, which will trigger the watches which calculate the "totals" field.
The fields can also be loaded from a saved state, which also triggers the watches which calculate the "totals" field.
The "totals" field can also be manually overridden, saved, and loaded.
The problem occurs when a manually overridden "totals" field is loaded with the other fields. The watches which recalculate the "totals" are triggered, and overwrite the manually overridden "totals".
I need to be able to ignore watches while the load is occurring. Is there any way to to this?
I know a watcher can be disabled using the de-registration function that is passed back when you create a watch, but when you re-create the watcher is still knows that the data it was watching has changed.
Note: This is an oversimplified description of the business logic surrounding the issue. Not being able to disable a watch would require a significant amount of work.
Here is a fiddle showing the problem: jsfiddle.net/vGWZy/1/
Your can store watcher's callbacks and disabler in special service, and use binding and unbinding of them with service method's
Example with your code 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');
};
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With