2014-06-30 12 views
9

Nie rozumiem, jak działa modułowe w zależności.Angularjs - jak poprawić usługę iniekcyjną z innego modułu, który nie jest zależny?

Mam 3 moduły, są one zależne od siebie nawzajem, jak pokazano na rysunku. enter image description here

"Moduł aplikacji" zawiera "moduł1" i "moduł2". "module2" zawiera moduł "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"]); 

Gdybym wstrzyknąć usługi z modułu do modułu jądra „module1” to praca dobrze. Ale moduł "core" nie zależy od modułu "module1". Dlaczego to się dzieje?

Odpowiedz

12

Ponieważ moduł App zależy od modułu Core (pośrednio poprzez moduł 2), usługi w module rdzeniowym są dostępne w dowolnym miejscu wewnątrz modułu aplikacji (w tym moduł 1).

Dzieje się tak, ponieważ Angular najpierw załaduje wszystkie moduły, a następnie rozpocznie tworzenie ich komponentów i rozwiązywanie zależnych zależności.

Jednak, jeśli rzeczywiście potrzebujesz usług podstawowych w Module 1, powinieneś również uzależnić go od modułu Core. W ten sposób aplikacja nie ulegnie zniszczeniu, jeśli moduł 2 zostanie zmodyfikowany później (lub całkowicie usunięty), a moduł 1 będzie bardziej zamknięty i wielokrotnego użytku (np. Można go użyć z inną aplikacją, która nie zależy od Moduł podstawowy).

Ogólnie nie powinieneś polegać na zależnościach "pośrednich". Każdy moduł powinien jawnie zadeklarować swoje zależności.
Angular jest wystarczająco inteligentny, aby załadować moduł tylko wtedy, gdy nie został jeszcze załadowany, więc nie ma narzutu.

Cytując z autorów przewodnika section on modules:

Moduły mogą notować inne moduły, jak ich zależności. W zależności od modułu oznacza to, że wymagany moduł musi zostać załadowany przed załadowaniem wymagającego modułu. Innymi słowy, bloki konfiguracyjne wymaganych modułów są wykonywane przed blokami konfiguracji wymagającego modułu. To samo dotyczy bloków run. Każdy moduł można załadować tylko jeden raz, nawet jeśli wymaga tego wiele innych modułów.

(Kopalnia nacisk)

+1

dobre wytłumaczenie! – micronyks

+0

To jest sztuczny przykład. Logicznie spodziewam się, że zobaczę błąd, ponieważ nie ma wyraźnej relacji między "rdzeniem" a "modułem 1". Dzięki – iKBAHT

+0

@iKBAHT: Nie ma za co! (Jeśli to odpowiada na pytanie, zaznacz je jako zaakceptowane i/lub pobudź je :)) – gkalpak