Heute treffe ich ein wirklich seltsames Verhalten in AngularJS mit $ watch. Ich vereinfachte meinen Code auf das folgende Beispiel:
https://jsfiddle.net/yLeLuard/
Dieses Beispiel enthält einen Dienst, die Spur eines state
variabel halten. Die Anweisungen werden verwendet, um ein Klickereignis an das DOM zu binden, wobei die Variable state
über den Service geändert wird.
Es gibt zwei Probleme in diesem Beispiel:
- Die erste Schließen-Schaltfläche (mit ng Sie auf Eigenschaft auf sie) ändert nur den Zustand auf dem zweiten Klick
- Die beiden Tasten ohne ng- Klick ändern sich nicht um den Zustand an allen
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
};
});
Wie wäre es, wenn Sie Ihre Anweisungen öffnen und schließen und stattdessen 'ng-click =" api.isOpen = true "' und 'ng-click =" api.isOpen = false "' verwenden. Es ist besser, native Direktiven zu verwenden, anstatt ein 'click' Ereignis zu binden. – floribon
@floribon es gibt viel mehr Funktionalität in meinen echten Direktiven, daher kann ich nicht ng-click verwenden. Außerdem möchte ich wirklich wissen, warum das nicht richtig funktioniert. – Pascal
Ich verstehe. Entfernen Sie dann den 'ng-Klick' und behalten Sie nur Ihre Anweisung. Was passierte, war, dass 'ng-click' einen Scope-Digest auslöste, so dass es scheinbar funktionierte, aber unzuverlässig war. – floribon