55 votes

angularjs: événement de diffusion de directive

J'ai vu des gens faire cela n'importe où dans leur code:

 $rootScope.$broadcast('someEvent', someParameter); 
 

puis dans un contrôleur:

 $rootScope.$on('someEvent', function(event, e){ /* implementation here */ });
 

Maintenant, je voudrais diffuser un événement d'une directive. Est-ce une bonne pratique de le diffuser au niveau rootScope? Je voudrais gérer cet événement dans un contrôleur. Puis-je utiliser $ scope ou dois-je toujours écouter sur $ rootScope?

81voto

Mark Rajcok Points 85912

Dans mon cas, je veux juste de diffuser un même d'une directive, le contrôleur de la vue, dans lequel j'utilise la directive. Est-il encore un sens à l'utilisation de diffusion alors?

J'aurais la directive appeler une méthode sur le contrôleur, qui est spécifié dans le code HTML où la directive est utilisée:

Pour une directive qui utilise un isolat de la portée:

<div my-dir ctrl-fn="someCtrlFn(arg1)"></div>

app.directive('myDir', function() {
  return {
    scope: { ctrlFn: '&' },
    link: function(scope, element, attrs) {
       ...
       scope.ctrlFn({arg1: someValue});
    }

Pour une directive qui n'utilise pas un isolat de la portée:

<div my-dir ctrl-fn="someCtrlFn(arg1)"></div>

app.directive('myDir', function($parse) {
  return {
    scope: true,  // or no new scope -- i.e., remove this line
    link: function(scope, element, attrs) {
       var invoker = $parse(attrs.ctrlFn);
       ...
       invoker(scope, {arg1: someValue} );
    }

13voto

joakimbl Points 9081

Il est généralement judicieux de ne pas utiliser $ rootScope car il est global et vous ne devriez pas le polluer à moins de savoir vraiment ce que vous faites. Je vous recommande de lire cet article sur la communication entre services, directives et contrôleurs .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X