Dzisiaj spotykam się z naprawdę dziwnym zachowaniem w AngularJS przy użyciu funkcji $ watch. I uproszczone mojego kodu na poniższym przykładzie:
https://jsfiddle.net/yLeLuard/
Przykład ten zawiera usługę, która będzie śledzić zmiennej state
. Dyrektywy są używane do wiązania zdarzenia kliknięcia z DOM zmieniając zmienną state
za pośrednictwem usługi.
Istnieją dwa problemy w tym przykładzie:
- Pierwszy przycisk zamykania (właściwość ng kliknij na nim) zmienia tylko stan na drugim kliknięciem
- dwa przyciski bez ng- kliknięcie nie zmieniają stanu wcale
main.html
<div ng-controller="main">
State: {{ api.isOpen | json }}
<div ng-click="" open>
<button>Open - Working fine</button>
</div>
<div ng-click="" close>
<button>Close - Works, but only on second click</button>
</div>
<div open>
<button>Open - Not Working</button>
</div>
<div close>
<button>Close - Not Working</button>
</div>
</div>
main.js
var myApp = angular.module('myApp', []);
myApp.controller('main', ['$scope', 'state', function($scope, state) {
$scope.api = state;
$scope.api.isOpen = false;
$scope.$watch('api.isOpen', function() {
console.log('state has changed');
});
}]);
myApp.directive('open', ['state', function(state) {
return {
restrict: 'A',
scope: {},
replace: true,
template: '<button>Open</button>',
link: function(scope, element) {
element.on('click', function() {
state.isOpen = true;
});
}
};
}]);
myApp.directive('close', ['state', function(state) {
return {
restrict: 'A',
scope: {},
replace: true,
template: '<button>Close</button>',
link: function(scope, element) {
element.on('click', function() {
state.isOpen = false;
});
}
};
}]);
myApp.service('state', function() {
return {
isOpen: null
};
});
Co powiesz na to, że usuwasz swoje dyrektywy otwierając i zamykając, a zamiast tego użyj 'ng-click =" api.isOpen = true "' i 'ng-click =" api.isOpen = false "'. Lepiej jest używać natywnych dyrektyw niż wiązania "click" event – floribon
@floribon W moich prawdziwych dyrektywach jest o wiele więcej funkcjonalności, dlatego nie mogę używać ng-click. Poza tym, naprawdę chcę wiedzieć, dlaczego to nie działa poprawnie. – Pascal
Rozumiem. Następnie usuń 'ng-click' i zachowaj tylko swoją dyrektywę. Co się dzieje, to, że 'ng-click' uruchamiał skrót zakresu, więc wydawało się, że działa, ale był niewiarygodny. – floribon