2013-04-26 15 views
5

Ho più istanze di una direttiva e vorrei scegliere solo un'istanza specifica. Ad esempio nel codice qui sotto, come posso assicurarmi che il div con class="one" sia l'unico che viene attivato dall'evento $rootScope.$broadcast('myEvent').AngularJS: come indirizzare una direttiva specifica con più istanze

JS:

myApp.directive('myDirective', function() { 
    return { 
     restrict: 'A', 
     controller: function(scope, el, attrs) { 
      scope.$on('myEvent', function() { 
       el.css({left: '+=100'}); 
      }); 
     }, 
    };  
}); 

HTML:

<div my-directive class="one"></div> 
<div my-directive class="two"></div> 
+0

per quanto ne so, non è possibile, poiché è una trasmissione tutti gli ambiti figlio riceveranno la notifica dell'evento –

risposta

4

Si dovrebbe fare questo controllo nel vostro gestore di eventi:

myApp.directive('myDirective', function() { 
    return { 
    restrict: 'A', 
     controller: function(scope, el, attrs) { 
     scope.$on('myEvent', function(ev,args) { 
      //do the check - you could provide a function, a value or something else 
      if(el.hasClass(args.class)){ 
      el.css({left: '+=100'}); 
      } 
     }); 
     }, 
    };  
}); 

quindi aggiungere i parametri nella $ trasmissione

$rootScope.$broadcast('myEvent',{class:'one'}) 
+0

Grazie a lo t per questa fantastica soluzione. – Wishnu

1

Si potrebbe definire un nuovo attributo per questa direttiva, che fa riferimento a un callback che poi viene eseguito all'interno del callback di $ su:

myApp.directive('myDirective', function() { 
    return { 
     restrict: 'A', 
     scope: { 
      callme: "=" 
     }, 
     controller: function(scope, el, attrs) { 
      scope.$on('myEvent', function() { 
       scope.callme(el) 
      }); 
     }, 
    };  
}); 

HTML dichiarazione:

<div my-directive class="one" callme="functionDefinedInScope"></div> 

Nel vostro ambito Controller:

$scope.functionDefinedInScope = function(el) { 
    el.css({left: '+=100'}); 
} 

Ulteriori informazioni al riguardo: http://docs.angularjs.org/guide/directive (Sezione "D" DIRETTIVA definizione di oggetto ")

+0

Potrebbe non funzionare per il mio caso. Ho dimenticato di menzionare che potrei prendere di mira una qualsiasi delle direttive in momenti diversi. – teggy

0

è possibile utilizzare id al posto di classe

<div my-directive id="one"></div> 
<div my-directive id="two"></div> 

e nel controllore

controller: function(scope, el, attrs) { 
    scope.moveElement = function() { 
     el.css({left: '+=100'}); 
    } 
} 

e allora invece di trasmissione,

angular.element('#one').scope().moveElement() 
Problemi correlati