2014-06-30 13 views
9

Non ho capito come funziona il lavoro modulare.Angularjs - come correggere il servizio di iniezione da un altro modulo che non dipende?

Ho 3 moduli, sono dipendenti l'uno dall'altro, come mostrato nell'immagine. enter image description here

Il modulo "App" include "module1" e "module2". "module2" include il modulo "core". There are source on plunker.

angular.module("core", []).factory("HelloWorld", function() { 
    return function() { 
    alert('Hello World!') 
    } 
}); 

angular.module("module1", []).controller("main", function(HelloWorld){ 
    HelloWorld(); 
}); 

angular.module("module2", ["core"]); 

angular.module("app", ["module1", "module2"]); 

Se iniettare servizio dal nucleo modulo a modulo "modulo1" è un lavoro soddisfacente. Ma il modulo "core" non dipende dal modulo "module1". Perché sta succedendo?

risposta

12

Poiché il modulo dell'app dipende dal modulo principale (indirettamente tramite il modulo 2), i servizi nel modulo principale sono disponibili ovunque all'interno del modulo dell'app (incluso il modulo 1).

Questo perché Angular caricherà prima tutti i moduli e quindi inizierà l'istanziazione dei componenti e la risoluzione delle dipendenze iniettate.

Eppure, se effettivamente avete bisogno di servizi di base nel modulo 1, dovreste farlo dipendere anche dal modulo principale. In questo modo la tua applicazione non si interromperà se il Modulo 2 verrà modificato in un secondo momento (o rimosso del tutto) e il tuo Modulo 1 sarà più autonomo e riutilizzabile (ad esempio potresti usarlo con un'applicazione diversa che non dipende dal Modulo principale).

In generale, non si deve fare affidamento su dipendenze "indirette". Ogni modulo dovrebbe dichiarare esplicitamente le sue dipendenze.
Angolare è abbastanza intelligente da caricare un modulo solo se non è già caricato, quindi non c'è un sovraccarico.

Citando dal Developer Guida section on modules:

I moduli possono elencare altri moduli come le loro dipendenze. A seconda di un modulo, è necessario caricare il modulo richiesto prima di caricare il modulo richiesto. In altre parole, i blocchi di configurazione dei moduli richiesti vengono eseguiti prima dei blocchi di configurazione del modulo richiesto. Lo stesso vale per i blocchi di corsa. Ogni modulo può essere caricato una sola volta, anche se sono richiesti più altri moduli.

(sottolineatura mia)

+1

buona spiegazione! – micronyks

+0

Questo è un esempio artificiale. Logicamente mi aspettavo di vedere un errore, perché non esisteva una relazione esplicita tra "core" e "module1". Grazie – iKBAHT

+0

@iKBAHT: sei il benvenuto! (Se questo risponde alla domanda contrassegnarlo come accettato e/o svuotarlo :)) – gkalpak

Problemi correlati