2013-08-01 11 views
7

Mam dyrektywę, której używam wiele razy na stronie. Wystrzeliwuje zdarzenie, gdy stan się zmienia, a kontroler następnie obsługuje zdarzenie.Wiele instancji i zdarzeń dyrektywy

Problem polega na tym, że zdarzenie jest uruchamiane dwa razy. Rozumiem, dlaczego tak się dzieje, ale utknąłem, próbując znaleźć obejście lub lepszy projekt. Jakieś wskazówki?

Plunker przykład: http://plnkr.co/edit/xObOvi253qejphU5arFr

+0

Czy każda dyrektywa modyfikuje właściwość 'foo' nadrzędnego zakresu? Jeśli nie, po prostu dodaj 'scope: true' do swojej dyrektywy, a następnie każdy będzie miał własną własność' foo' (i tylko jedno zdarzenie zostanie uruchomione). –

+1

W tobie plunker, wszystkie elementy mają ten sam zakres $, dlaczego po prostu nie użyjesz zegarka $ bezpośrednio w głównym kontrolerze? – DotDotDot

Odpowiedz

7

Trzeba zdefiniować samodzielnie zakresu bramkę na dyrektywę wielokrotnego użytku. Prosta poprawka polega na dodaniu scope: {}, aby utworzyć izolowany zakres, więc po kliknięciu każdego przycisku uruchamiany jest tylko jeden raz.

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 ... Tęskniłem za tym. Dzięki! Problem polega na tym, że tworząc swój przykład zapomniałem, że mój zakres jest faktycznie udostępniany przez '$ location.search(). Foo'. Naprawdę chcę tego udostępniania; Po prostu pomyślałem, że to sam zakres został udostępniony (tj. Nie przez lokalizację $). Więc myślę, że moją odpowiedzią może być zamiana kontrolera w usługę ... –

+0

@JasonCapriotti To ma sens. – zsong

+2

Mój refaktoryzowany plunk, ze stanem przechowywanym w serwisie, a nie kontrolerem dyrektywy .. http://plnkr.co/edit/wwwp3y –

Powiązane problemy