2013-08-01 2 views
7

페이지에서 여러 번 사용하는 지시문이 있습니다. 상태가 변경되면 이벤트가 발생하고 컨트롤러가 이벤트를 처리합니다.다중 지시문 인스턴스 및 이벤트

문제는 이벤트가 두 번 발생한다는 것입니다. 나는 이것이 왜 일어나는 지 알지만, 해결 방법이나 더 나은 디자인을 찾으려고 노력 중이다. 어떤 팁?

Plunker 예 : http://plnkr.co/edit/xObOvi253qejphU5arFr

+0

각 지시어가 부모 범위의'foo' 속성을 수정해야합니까? 그렇지 않다면 지시어에'scope : true'를 추가하면 각자 자신의'foo' 속성이 생깁니다 (단 하나의 이벤트 만 실행됩니다). –

+1

plunker에서 모든 요소는 같은 $ scope를 공유합니다. 왜 주 컨트롤러에서 $ watch를 직접 사용하지 않습니까? – DotDotDot

답변

7

당신은이 지침의 재사용을 위해 격리 된 범위를 정의 할 필요가있다. 간단한 수정은 고립 된 범위를 만들기 위해 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); 
     }); 
    } 
    }; 
}); 
+0

아 ... 나는 그것을 놓쳤다. 감사! 이제 문제는 내 예제를 만드는 것입니다. 내 범위가'$ location.search(). foo'를 통해 실제로 공유되는 것을 잊어 버렸습니다. 나는 실제로이 공유를 원한다. 방금 공유 한 범위 자체라고 생각했습니다 (즉, $ 위치를 통하지 않음). 그래서 내 대답은 서비스로 컨트롤러를 리팩터링하는 것일 수도 있다고 생각합니다. –

+0

@JasonCapriotti 의미가 있습니다. – zsong

+2

내 리팩토링 된 plunk. 지시어의 컨트롤러가 아닌 서비스에 저장된 상태. http://plnkr.co/edit/wwwp3y –