2013-08-01 21 views
7

Ich habe eine Direktive, die ich mehrmals auf einer Seite verwende. Wenn der Status geändert wird, wird ein Ereignis ausgelöst, und der Controller verarbeitet das Ereignis.Mehrere Direktive Instanzen und Ereignisse

Das Problem ist, dass das Ereignis zweimal ausgelöst wird. Ich verstehe, warum das passiert, aber ich stehe entweder auf der Suche nach einem Workaround oder besserem Design. Irgendwelche Tipps?

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

+0

Sollte jede Direktive die Eigenschaft 'foo' des übergeordneten Bereichs ändern? Wenn nicht, füge einfach 'scope: true' zu ​​deiner Direktive hinzu und dann hat jede ihre eigene' foo' Eigenschaft (und nur ein Event wird ausgelöst). –

+1

In Ihnen haben alle Elemente denselben $ scope, warum benutzen Sie $ watch nicht direkt im Hauptcontroller? – DotDotDot

Antwort

7

Sie müssen isolierten Bereich definieren, die Richtlinie wiederverwendbar zu machen. Eine einfache Lösung besteht darin, einfach scope: {} hinzuzufügen, um einen isolierten Bereich zu erstellen. Wenn Sie also auf jede Schaltfläche klicken, wird sie nur einmal ausgelöst.

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

Ah ... das habe ich vermisst. Vielen Dank! Jetzt ist das Problem, wenn ich mein Beispiel erstelle, vergaß ich, dass mein Bereich tatsächlich über '$ location.search(). Foo' geteilt wird. Ich möchte dieses Teilen wirklich; Ich dachte nur, dass der Bereich selbst geteilt wurde (d. H. Nicht über $ location). Also denke ich, meine Antwort könnte sein, den Controller in einen Service umzuwandeln ... –

+0

@JasonCapriotti Das macht Sinn. – zsong

+2

Meine Refaktorierte Plunk, mit Zustand im Dienst statt der Direktive der Direktive gespeichert .. http://plnr.co/edit/wwwp3y –