2013-08-01 21 views
7

Ho una direttiva che uso più volte su una pagina. Spara un evento quando lo stato cambia e il controller gestisce l'evento.Istanze ed eventi con più direttive

Il problema è che l'evento viene generato due volte. Capisco perché succede, ma sono bloccato o cercando di trovare una soluzione alternativa o migliore. Qualche consiglio?

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

+0

Ogni direttiva deve modificare la proprietà 'foo' dell'ambito genitore? Altrimenti, aggiungi 'scope: true' alla tua direttiva e poi ognuno avrà la sua proprietà' foo' (e un solo evento verrà attivato). –

+1

In plunk, tutti gli elementi condividono lo stesso $ scope, perché non usi semplicemente $ watch direttamente nel controller principale? – DotDotDot

risposta

7

è necessario definire la portata isolata per rendere la direttiva riutilizzabile. Una semplice soluzione consiste nell'aggiungere semplicemente scope: {} per creare un ambito isolato, quindi quando fai clic su ciascun pulsante, si attiva solo una volta.

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 ... mi è mancato. Grazie! Ora il problema è nel creare il mio esempio. Ho dimenticato che il mio scope è effettivamente condiviso tramite '$ location.search(). Foo'. In realtà voglio questa condivisione; Ho solo pensato che fosse lo stesso scopo condiviso (cioè non tramite $ posizione). Quindi penso che la mia risposta potrebbe essere il refactoring del controller in un servizio ... –

+0

@JasonCapriotti Questo ha senso. – zsong

+2

Il mio plunk refactored, con stato memorizzato in servizio anziché controller della direttiva. Http://plnkr.co/edit/wwwp3y –