2014-06-30 11 views
9

Ich habe nicht verstanden, wie modular arbeiten.Angularjs - Wie kann man den Service von einem anderen Modul, das nicht abhängig ist, korrigieren?

Ich habe 3 Module, sie sind voneinander abhängig, wie im Bild gezeigt. enter image description here

Das "App" -Modul umfasst "module1" und "module2". "module2" enthält "Core" -Modul. 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"]); 

Wenn ich spritze Service von Modul Modul Kern „module1“ es Arbeit in Ordnung ist. Aber "Kern" -Modul hängt nicht vom Modul "module1" ab. Warum passiert es?

Antwort

12

Da Ihr App-Modul vom Core-Modul abhängt (indirekt über Modul 2), sind die Services im Core-Modul überall in Ihrem App-Modul verfügbar (einschließlich Modul 1).

Dies liegt daran, dass Angular zuerst alle Module lädt und dann beginnt, ihre Komponenten zu instanziieren und injizierte Abhängigkeiten aufzulösen.

Wenn Sie Core-Dienste tatsächlich in Modul 1 benötigen, sollten Sie sie auch vom Core-Modul abhängig machen. Auf diese Weise wird Ihre Anwendung nicht kaputt gehen, wenn Modul 2 zu einem späteren Zeitpunkt geändert (oder komplett entfernt) wird und Ihr Modul 1 eigenständiger und wiederverwendbar ist (zB könnten Sie es mit einer anderen Anwendung verwenden, die nicht von der Kern Modul).

Im Allgemeinen sollten Sie sich nicht auf "indirekte" Abhängigkeiten verlassen. Jedes Modul sollte seine Abhängigkeiten explizit deklarieren.
Angular ist schlau genug, nur ein Modul zu laden, wenn es nicht bereits geladen ist, so dass es keinen Overhead gibt.

aus dem Developer Zitiert Guide section on modules:

Module können als ihre Abhängigkeiten andere Module aufzulisten. Abhängig von einem Modul bedeutet, dass das erforderliche Modul geladen werden muss, bevor das anfordernde Modul geladen wird. Mit anderen Worten, die Konfigurationsblöcke der erforderlichen Module werden vor den Konfigurationsblöcken des anfordernden Moduls ausgeführt. Dasselbe gilt für die Laufblöcke. Jedes Modul kann nur einmal geladen werden, auch wenn mehrere andere Module es erfordern.

(Hervorhebung von mir)

+1

Gute Erklärung! – micronyks

+0

Dies ist ein künstliches Beispiel. Logischerweise habe ich einen Fehler erwartet, weil dort keine explizite Beziehung zwischen "core" und "module1" besteht. Danke – iKBAHT

+0

@iKBAHT: Gern geschehen! (Wenn dies die Frage beantwortet, bitte markieren Sie es als akzeptiert und/oder upvote :)) – gkalpak