페이지에서 여러 번 사용하는 지시문이 있습니다. 상태가 변경되면 이벤트가 발생하고 컨트롤러가 이벤트를 처리합니다.다중 지시문 인스턴스 및 이벤트
문제는 이벤트가 두 번 발생한다는 것입니다. 나는 이것이 왜 일어나는 지 알지만, 해결 방법이나 더 나은 디자인을 찾으려고 노력 중이다. 어떤 팁?
Plunker 예 : http://plnkr.co/edit/xObOvi253qejphU5arFr
페이지에서 여러 번 사용하는 지시문이 있습니다. 상태가 변경되면 이벤트가 발생하고 컨트롤러가 이벤트를 처리합니다.다중 지시문 인스턴스 및 이벤트
문제는 이벤트가 두 번 발생한다는 것입니다. 나는 이것이 왜 일어나는 지 알지만, 해결 방법이나 더 나은 디자인을 찾으려고 노력 중이다. 어떤 팁?
Plunker 예 : http://plnkr.co/edit/xObOvi253qejphU5arFr
당신은이 지침의 재사용을 위해 격리 된 범위를 정의 할 필요가있다. 간단한 수정은 고립 된 범위를 만들기 위해 scope: {}
을 추가하는 것입니다. 그래서 각 버튼을 클릭 할 때 한 번만 실행됩니다.
app.directive('myDirective', function() {
return {
restrict: 'E',
scope: {}, // Add this line to create an isolated scope
template: '<div>Foo: {{foo}}</div><button ng-click="incrementFoo()">Increment Foo</button>',
controller: function ($scope) {
$scope.foo = 0;
$scope.incrementFoo = function() {
$scope.foo += 1;
};
$scope.$watch('foo', function() {
$scope.$emit('fooChanged', {foo: $scope.foo});
console.log($scope);
});
}
};
});
아 ... 나는 그것을 놓쳤다. 감사! 이제 문제는 내 예제를 만드는 것입니다. 내 범위가'$ location.search(). foo'를 통해 실제로 공유되는 것을 잊어 버렸습니다. 나는 실제로이 공유를 원한다. 방금 공유 한 범위 자체라고 생각했습니다 (즉, $ 위치를 통하지 않음). 그래서 내 대답은 서비스로 컨트롤러를 리팩터링하는 것일 수도 있다고 생각합니다. –
@JasonCapriotti 의미가 있습니다. – zsong
내 리팩토링 된 plunk. 지시어의 컨트롤러가 아닌 서비스에 저장된 상태. http://plnkr.co/edit/wwwp3y –
각 지시어가 부모 범위의'foo' 속성을 수정해야합니까? 그렇지 않다면 지시어에'scope : true'를 추가하면 각자 자신의'foo' 속성이 생깁니다 (단 하나의 이벤트 만 실행됩니다). –
plunker에서 모든 요소는 같은 $ scope를 공유합니다. 왜 주 컨트롤러에서 $ watch를 직접 사용하지 않습니까? – DotDotDot