Это был очень интересный вопрос, поэтому проблема с комбинацией ваших щелкнул обработчик и предпочтения.электронная почта часы:
angularjs код:
//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;
Вы начинаете с нажатием на обув + бар и мы имеем:
all: true
foo: true
bar: true
Нажмите на тумблер все:
//by this code
var new_val = toggled_input_value();
$scope.model = new_val;
$ scope.model является сфера [имя_области] из приведенного выше кода, так что сфера [имя_области] = ложь и LastValue = верно, parentValue = истина (они будут изменения после того, как $ переваривать бег)
$scope.clicked({ value: new_val });
будет звоните
$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;
}
}
так,
all: true - $digest have not been run
foo: false
bar: false
и начинают $ переваривать ... первый звонок будет:
$scope.$watch('preferences.email', function(new_value){
var bool = new_value.foo && new_value.bar;
$scope.preferences.all = bool;
}, true);
так,
all: false
foo: false
bar: false
это проблема, потому что на следующий parentValueWatch вызова мы получим:
parentValue = false //$scope.preferences.all
scope[scopeName] = false //$scope.model
lastValue = true
так, parentValue === Сфера [имя_области] , и lastValue не были обновлены ... это ошибка:
, когда вы будете чанг е $ scope.preferences.all к истинному, вы получите
$scope.preferences.all === lastValue //true
и вызвать
// if the parent can be assigned then do so
parentSet(parentScope, parentValue = lastValue = scope[scopeName]);
так, $ scope.preferences.all станет ложным, а не истинным
вы можете посмотреть на это здесь http://plnkr.co/edit/YEHqA101YwWKDvK6odFf?p=preview (console.trace)
им не уверен, что я следую вашей проблеме? все работает для меня, когда я нажимаю на foo, каждый раз, когда не сработает ... –
это то, где *** иногда *** усложняет ситуацию, позвольте мне попытаться найти неудачную последовательность. – apneadiving
получил один, добавленный под вопрос – apneadiving