2013-03-17 17 views
58

Quindi ho alcuni plugin e librerie che voglio usare nella mia app angolare e (attualmente) sto semplicemente riferendo quelle funzioni/metodi così come erano intese nel 99% delle app in un modo che ignora completamente l'iniezione di dipendenza.AngularJS - Iniezione di dipendenza in servizi, fabbriche, filtri ecc.

Ho (ad esempio) la libreria javascript "MomentJS" che si occupa della formattazione e della convalida delle date e che ho utilizzato per questo nella mia app in controller, servizi e filtri. Il modo in cui ho imparato (usando AngularJS) è creare un servizio che faccia riferimento alla funzione (e ai suoi metodi) e iniettare quel servizio nei miei controller, che funziona alla grande.

Il problema è che ho davvero bisogno di fare riferimento a questa libreria in tutti i diversi tipi di componenti dai servizi ai filtri ai controller e tutto il resto. Quindi, suppongo che la mia domanda sia: come si fa l'iniezione di dipendenza in filtri, servizi e tutto ciò che non è un controller?

È possibile? E 'anche vantaggioso?

Qualsiasi aiuto sarebbe molto apprezzato :)

risposta

100

Sì, è possibile utilizzare l'iniezione di dipendenza per i filtri e le direttive

Ex:

Filtro:

app.filter('<filter>', ['$http', function(http){ 
    return function(data){ 
    } 
}]); 

direttiva:

app.directive('<directive>', ['$http', function(http){ 
    return { 
     .... 
    } 
}]); 

Servizio:

app.factory('<service>', ['$http', function(http) { 
    var shinyNewServiceInstance; 
    return shinyNewServiceInstance; 
}]); 
+7

Questo è esattamente quello che stavo cercando :) –

+1

Esiste un modo per piegare la sintassi per iniettare le dipendenze in un fornitore? Ho bisogno di entrambi: un fornitore a cui posso iniettare dei deps o un factory/servizio che posso iniettare in un blocco di configurazione (?) – Cody

+0

@Cody Services and factories _are_ providers. Anche '.config()' gestisce l'iniezione delle dipendenze nello stesso modo degli esempi sopra. –

21

Per ragioni di completezza, ecco un esempio di servizio con iniezione:

app.service('<service>', ['$http', function($http) { 
    this.foo = function() { ... } 
}]); 
+0

In questo momento non riesco a iniettare un controller in un servizio, almeno non il mio personale. Non dovrei proprio essere qui, ma non vedo un modo per far funzionare una direttiva modale che si trova all'esterno del controller che lo fa scattare. Ho creato un servizio per provare a fare la comunicazione bidirezionale pensando che il servizio potrebbe iniettare entrambi i controller ma ahimè .. quale sarebbe il modo migliore per raggiungere questo obiettivo. Vorrei fare domande qui, ma sembra essere bloccato per qualche motivo, quindi posso solo commentare cose simili. – landed

+0

Hai davvero bisogno di fare una domanda, preferibilmente con un [plnkr.co] (http://plnkr.co/) del tuo codice. – user1338062

+0

Mi piacerebbe essere in grado di scrivere domande - sembra che questo sito una volta che vieni bloccato per chiedere troppo ti blocca per sempre. In breve, penso che non si possano iniettare controller in cose (che suona comunque stupidi) Così ho creato il servizio e il setter getter e poi lo guardo per i cambiamenti nei controller che devono iscriversi agli aggiornamenti. Questo ha funzionato e mi ha permesso di controllare controller com. – landed

5

Mentre le risposte già esistenti siano corrette e di lavoro, John papas guida di stile angolare favorisce l'uso del servizio $inject in Y091:

Filtro:

app.filter('<filter', MyFilter); 
MyFilter.$inject = ['$http']; 
function MyFilter() { 
    return function(data) { 
    } 
} 

direttiva:

app.directive('<directive>', MyDirective); 
MyDirective.$inject = ['$http']; 
function MyDirective() { 
    return { 
    ... 
    } 
} 

fabbrica:

app.factory('<factory>', MyFactory); 
MyFactory.$inject = ['$http']; 
function MyFactory() { 
    var shinyNewServiceInstance; 
    return shinyNewServiceInstance; 
} 

Servizio:

app.service('<service>', MyService); 
MyService.$inject = ['$http']; 
function MyService() { 
    this.foo = foo; 
    function foo(){ 
    ... 
    } 
} 
Problemi correlati