2015-02-07 21 views
8

Desidero ascoltare gli eventi della finestra nel mio servizio AngularJS in modo che possa trasmetterli ai miei controller.Ascoltare eventi finestra in un servizio Angularjs

Ho un'estensione per Chrome che invia qualsiasi messaggio utilizzando port.postMessage('Any Message');.

voglio che il mio servizio angularjs per ascoltare il messaggio e inviarlo al controller utilizzando $rootScope.$broadcast("Something occurred.");

Dentro il mio servizio, sto cercando di farlo con la seguente ascoltatore.

window.addEventListener('Any Message', function (event) { 
    if (event.origin != window.location.origin) { 
     return; 
    } 
    $rootScope.$broadcast("Something occurred."); 
}); 

Ho anche provato $window ma non so il motivo per cui il codice di cui sopra non funziona. Anche il mio IDE, le webstorm di jetbrains classificano sopra lo snippet di codice come irraggiungibile.

Prima di questo, ho utilizzato il codice precedente in un controller e ha funzionato correttamente. Non stavo facendo trasmissione in controller. Ora voglio spostare questo al servizio in modo che tutti i controller possano essere in grado di ascoltarlo dal servizio.

risposta

9

Questo vuole essere esempio di lavoro che ho fatto - con la sottoscrizione di eventi DOM e trasmette l'evento dal servizio al regolatore: http://plnkr.co/edit/nk2aPt?p=preview

//this is service that creates subscription  
app.service('serviceName', function($window, $rootScope) { 

     function subsFunc() { 
     $window.addEventListener('click', function(e) { 
      $rootScope.$broadcast('app.clickEvent', e); 
     }) 
     } 

     return { 
     "subscribeMe": subsFunc  } 
    }); 

//this will be in controller 
    $rootScope.$on('app.clickEvent', function(a, b) { 
    //a,b - event object details 
    }); 
+1

Grazie, ha funzionato. –

0

Inietti quel servizio da qualche parte? I servizi verranno eseguiti solo se li si inietta davvero.

Inoltre, è preferibile utilizzare $ window anziché window, quindi sarà possibile prenderlo in giro in seguito nei test.

+0

Sì, faccio l'iniezione. Perché il mio IDE lo classifica come irraggiungibile? –

+0

Non so. Ti consigliamo inoltre di verificare se è necessario chiamare manualmente $ digest/$ apply, poiché potrebbe essere attivato al di fuori di AngularJS. Ad ogni modo, se non funziona - carica un plunker/jsfiddle che riproduce questo, sarà più facile aiutarti in questo modo. – AdirAmsalem

4

Qualcosa di simile potrebbe aiutare:

var app = angular.module('app', []); 

app.run(["$window", "$rootScope", function($window, $rootScope) { 

    $window.addEventListener('message', function(e) { 

     $rootScope.$broadcast('message', e.data); 
    }); 
} ]); 
0

Problema :

"$window listener" listen multiple time. 

Esempio:

Si consideri, abbiamo scritto un codice ascoltatore in Pagina B. La mia pagina iniziale è Pagina A.

Ho aggiunto un avviso nel codice dell'ascoltatore in Pagina B.

$window.addEventListener('message', function (e) { alert() }); 

Lets Go,

  • Pagina A >> Pagina B (numero di allarme 1) B >> Pagina A >> Pagina B (avviso conteggio 2) B >> Pagina A> > Pagina B (numero di avvisi 3)
Problemi correlati