Hôm nay tôi gặp phải một số hành vi thực sự kỳ lạ trong AngularJS sử dụng đồng hồ $. Tôi đơn giản hóa mã của tôi như ví dụ sau:
https://jsfiddle.net/yLeLuard/
Ví dụ này chứa một dịch vụ mà sẽ theo dõi của một biến state
. Các chỉ thị được sử dụng để liên kết sự kiện nhấp chuột với DOM thay đổi biến số state
thông qua dịch vụ.
Có hai vấn đề trong ví dụ này:
- Nút đóng đầu tiên (với ng-click tài sản trên nó) chỉ thay đổi trạng thái trên nhấp chuột thứ hai
- Hai nút mà không ng- nhấp chuột không thay đổi nhà nước ở tất cả các
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
};
});
cách bạn loại bỏ chỉ thị của mình mở và đóng và thay vào đó sử dụng 'ng-click =" api.isOpen = true "' và 'ng-click =" api.isOpen = false "'. Tốt hơn là nên sử dụng chỉ thị gốc thay vì ràng buộc sự kiện 'click' – floribon
@floribon có nhiều chức năng hơn trong chỉ thị thực của tôi, do đó tôi không thể sử dụng ng-click. Bên cạnh đó, tôi thực sự muốn biết tại sao điều này không hoạt động đúng. – Pascal
Tôi hiểu. Sau đó loại bỏ 'ng-click' và chỉ giữ chỉ thị của bạn. Điều gì đã xảy ra là 'ng-click' đã kích hoạt một phạm vi tiêu hóa vì vậy nó có vẻ là loại làm việc nhưng không đáng tin cậy – floribon