Es war sehr interessante Frage, so Problem mit Kombination Ihrer geklickt Handler und Vorlieben.E-Mail Uhr:
AngularJS Code:
//https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.js line 4510
scope.$watch(function parentValueWatch() {
var parentValue = parentGet(parentScope);
if (parentValue !== scope[scopeName]) {
// we are out of sync and need to copy
if (parentValue !== lastValue) {
// parent changed and it has precedence
lastValue = scope[scopeName] = parentValue;
} else {
// if the parent can be assigned then do so
parentSet(parentScope, parentValue = lastValue = scope[scopeName]);
}
}
return parentValue;
});
break;
Sie starten mit Klick auf foo + bar und wir haben:
all: true
foo: true
bar: true
Klicken Sie durch Toggle alle:
//by this code
var new_val = toggled_input_value();
$scope.model = new_val;
$ scope.model ist Umfang [Bereichsname] aus dem obigen Code, so Umfang [Bereichsname] = false und Lastvalue = true, parentValue = true (sie wird sich ändern, nachdem Lauf verdauen $)
$scope.clicked({ value: new_val });
wird rufen
$scope.toggleAll = function(new_value){
if (new_value){
$scope.preferences.email.foo = true;
$scope.preferences.email.bar = true;
}
else{
$scope.preferences.email.foo = false;
$scope.preferences.email.bar = false;
}
}
so,
all: true - $digest have not been run
foo: false
bar: false
und beginnen $ verdauen ... erste Anruf wird:
$scope.$watch('preferences.email', function(new_value){
var bool = new_value.foo && new_value.bar;
$scope.preferences.all = bool;
}, true);
so,
all: false
foo: false
bar: false
es ist ein Problem, denn auf der nächsten parentValueWatch Anruf werden wir bekommen:
parentValue = false //$scope.preferences.all
scope[scopeName] = false //$scope.model
lastValue = true
so, parentValue === Umfang [Bereichsname] und lastValue wurden nicht aktualisiert ... es ist ein Fehler :)
wenn Sie chang e $ scope.preferences.all zum wahren, werden Sie
$scope.preferences.all === lastValue //true
bekommen und
// if the parent can be assigned then do so
parentSet(parentScope, parentValue = lastValue = scope[scopeName]);
so, $ scope.preferences.all falsch wird sich nennen, statt eine echte
du kannst dir das hier ansehen http://plnkr.co/edit/YEHqA101YwWKDvK6odFf?p=preview (console.trace)
ich bin nicht sicher, ob ich deinem Problem folge? alles funktioniert für mich, wenn ich auf foo, bar jedes Mal kein Fehler ... –
das ist, wo die *** manchmal *** macht die Dinge schwierig, lass mich versuchen, eine fehlerhafte Sequenz zu finden – apneadiving
bekam eine, in Frage – apneadiving