2012-12-27 9 views
30

Come posso emettere eventi da una fabbrica o un servizio. Non riesco a iniettare $ scope in fabbrica, quindi non sono in grado di emettere eventi.come emettere eventi da una fabbrica

ottengo il seguente errore - Unknown provider: $scopeProvider <- $scope

Grazie, Murtaza

+0

Perché non guardare una variabile di servizio nel controller (s) invece di emettere eventi? –

+1

@AndersBornholm la funzione orologio in angolare viene attivata con ogni ciclo di digestione. I cicli di digest possono accadere abbastanza spesso a seconda dell'app. Pubsub offre un canale di comunicazione migliore. Non ha bisogno di essere valutato ad ogni ciclo di digestione. – kitimenpolku

risposta

55

Non è possibile iniettare l'ambito di un controller in un servizio. Che cosa si può fare è:

  • passare l'istanza ambito come parametro a una delle tue funzioni di servizio:

esempio

app.factory('MyService', function() { 

    return { 
     myFunction: function(scope) { 
     scope.$emit(...); 
     ... 
     } 
    }; 
}); 
  • iniettare il $ rootScope nel vostro servizio:

esempio

app.factory('MyService', ['$rootScope', function($rootScope) { 

    return { 
     myFunction: function() { 
     $rootScope.$emit(...); 
     ... 
     } 
    }; 
}]); 
+0

+ 1 per la risposta – murtaza52

+14

Non potrei fare una trasmissione da rootcope? – murtaza52

+0

Penso che questo sia l'unico modo per emettere l'evento verso l'alto in modo che i controller dello stesso livello non catturino l'evento emesso - se questo è quello che vuoi (era nel mio caso) –

54

Inject $ rootScope invece di $ portata e quindi emettono sul $ rootScope.

myApp.factory('myFactory', ['$rootScope', function ($rootScope) { 
    $rootScope.$emit("myEvent", myEventParams); 
}]); 

Le fabbriche non hanno accesso all'attuale controllore/ambito di applicazione perché non ce n'è uno. Hanno comunque accesso alla radice dell'applicazione e questo è il motivo per cui $ rootScope è disponibile.

+0

+ 1 per la risposta – murtaza52

+2

Questa è la risposta corretta, Factory non deve dipendere da un controller, poiché il loro ciclo di live è completamente diverso. –

-2

Nella tua fabbrica di iniettare $ rootScope AS

myApp.factory('myFactory',function($rootScope){ 
return({ 
// use $rootScope as below to pass myEventParams to all below in hierarchy 
$rootScope.$broadcast("myEvent",myEventParams); 

}) 
}]); 
+0

Realmente non capisco il voto una risposta come non utile senza dare una giustificazione adeguata. Altamente poco professionale. –

+2

Bene, la tua risposta è fondamentalmente un duplicato delle risposte di 5 anni sopra di esso e non aggiunge nulla pur essendo meno chiara delle due risposte accettate esistenti. Quali informazioni pensavi di aggiungere? – toxaq

Problemi correlati