AngularJS: Qual é a melhor maneira de vincular a um evento global em uma diretiva

Imagine a situação no AngularJS em que você deseja criar uma diretiva que precise responder a um evento global. Nesse caso, digamos, o evento de redimensionamento de janela.

Qual é a melhor abordagem para isso? Na minha opinião, temos duas opções: 1. Permita que todas as diretivas se vinculem ao evento e façam mágica no elemento atual 2. Crie um ouvinte global de eventos que faça um seletor DOM para obter cada elemento no qual a lógica deve estar aplicado.

A opção 1 tem a vantagem de você já ter acesso ao elemento no qual deseja executar algumas operações. Mas ... as opções 2 têm a vantagem de que você não precisa vincular várias vezes (para cada diretiva) no mesmo evento, o que pode ser um benefício de desempenho.

Vamos ilustrar as duas opções:

Opção 1:

angular.module('app').directive('myDirective', function(){

     function doSomethingFancy(el){
         // In here we have our operations on the element
    }

    return {
        link: function(scope, element){
             // Bind to the window resize event for each directive instance.
             angular.element(window).on('resize', function(){
                  doSomethingFancy(element);
             });
        }
    };
});

Opção 2:

angular.module('app').directive('myDirective', function(){

    function doSomethingFancy(){
         var elements = document.querySelectorAll('[my-directive]');
         angular.forEach(elements, function(el){
             // In here we have our operations on the element
         });
    }

    return {
        link: function(scope, element){
             // Maybe we have to do something in here, maybe not.
        }
    };

    // Bind to the window resize event only once.
    angular.element(window).on('resize', doSomethingFancy);
});

Ambas as abordagens estão funcionando bem, mas acho que a opção dois não é realmente 'Angular-ish'.

Alguma ideia?

questionAnswers(5)

yourAnswerToTheQuestion