Mam kilka modułów Angular zadeklarowanych w mojej aplikacji. Początkowo zacząłem je deklarować, używając składni „łańcuchowej” w następujący sposób:
angular.module('mymodule', [])
.controller('myctrl', ['dep1', function(dep1){ ... }])
.service('myservice', ['dep2', function(dep2){ ... }])
... // more here
Ale zdecydowałem, że nie jest to łatwe do odczytania, więc zacząłem je deklarować za pomocą zmiennej modułu, takiej jak ta:
var mod = angular.module('mymodule', []);
mod.controller('myctrl', ['dep1', function(dep1){ ... }]);
mod.service('myservice', ['dep2', function(dep2){ ... }]);
...
Druga składnia wydaje mi się dużo bardziej czytelna, ale moim jedynym zarzutem jest to, że ta składnia pozostawia mod
zmienną w zasięgu globalnym. Jeśli kiedykolwiek miałbym nazwaną inną zmienną mod
, byłaby ona nadpisana następną (i innymi problemami związanymi ze zmiennymi globalnymi).
Więc moje pytanie brzmi: czy to najlepszy sposób? A może lepiej byłoby zrobić coś takiego ?:
(function(){
var mod = angular.module('mymod', []);
mod.controller('myctrl', ['dep1', function(dep1){ ... }]);
mod.service('myservice', ['dep2', function(dep2){ ... }]);
...
})();
A może to w ogóle ma znaczenie, żeby się tym przejmować? Ciekawe, jakie są „najlepsze praktyki” dotyczące deklaracji modułów. Z góry dziękuję.
Odpowiedzi:
„Najlepszy” sposób na zadeklarowanie modułu
Ponieważ angular jest w samym zasięgu globalnym, a moduły są zapisywane w jego zmiennej, dostęp do modułów można uzyskać za pośrednictwem
angular.module('mymod')
:Żadne inne zmienne globalne nie są wymagane.
Oczywiście wszystko zależy od preferencji, ale myślę, że jest to najlepsza praktyka
Opcje sortowania modułów i plików
Ten sposób deklarowania i uzyskiwania dostępu do modułów sprawia, że jesteś bardzo elastyczny. Możesz sortować moduły według typu funkcji (jak opisano w innej odpowiedzi) lub według trasy, np .:
Ostateczny sposób sortowania jest kwestią gustu oraz skali i rodzaju projektu. Osobiście lubię grupować wszystkie pliki modułu w tym samym folderze (uporządkowane w podfoldery dyrektyw, kontrolerów, usług i filtrów), w tym wszystkie różne pliki testowe, ponieważ sprawia to, że twoje moduły są bardziej wielokrotnego użytku. Tak więc w projektach średniej wielkości otrzymuję moduł podstawowy, który zawiera wszystkie podstawowe trasy i ich kontrolery, usługi, dyrektywy i mniej lub bardziej złożone podmoduły, kiedy myślę, że mogą być przydatne również w innych projektach, np. :
W przypadku bardzo dużych projektów czasami kończę grupowanie modułów według tras, jak opisano powyżej lub według wybranych głównych tras, a nawet kombinacji tras i wybranych komponentów, ale to naprawdę zależy.
EDYCJA: Tylko dlatego, że jest to powiązane, a ostatnio znowu na to natknąłem: Uważaj, aby utworzyć moduł tylko raz (dodając drugi parametr do funkcji angular.module). Spowoduje to zepsucie aplikacji i może być bardzo trudne do wykrycia.
EDYCJA 2015 dotycząca sortowania modułów: Półtora roku późniejszych doświadczeń z kątami, mogę dodać, że korzyści wynikające z używania modułów o różnych nazwach w Twojej aplikacji są nieco ograniczone, ponieważ AMD nadal nie działa dobrze z Angular i usługami, dyrektywami i filtrami i tak są globalnie dostępne w kontekście kątowym ( jak pokazano tutaj na przykładzie ). Jednak nadal istnieje semantyczna i strukturalna korzyść i może być pomocne włączenie / wyłączenie modułu z jedną linią kodu skomentowaną lub usuniętą.
Również prawie nigdy nie ma sensu rozdzielanie podmodułów według typu (np. „MyMapSubModule.controllers”), ponieważ zwykle są one od siebie zależne.
źródło
'use strict';
wewnątrz komponentu.module.controller(function () { 'use strict'; ... });
Uwielbiam przewodnik po stylach kątowych autorstwa Johnpapy, a oto kilka zasad związanych z tym pytaniem:
Reguła: Funkcje nazwane a funkcje anonimowe
Unikaj korzystania z funkcji anonimowych:
Zamiast tego użyj nazwanych funkcji:
Jak mówi autor:
This produces more readable code, is much easier to debug, and reduces the amount of nested callback code.
Reguła: zdefiniuj 1 komponent na plik.
Unikaj wielu komponentów w jednym pliku:
Intead, użyj jednego pliku do zdefiniowania modułu:
jeden plik po prostu używa modułu do zdefiniowania komponentu
i inny plik do zdefiniowania innego komponentu
Oczywiście istnieje wiele innych zasad dotyczących modułów, kontrolerów i usług, które są całkiem przydatne i warte przeczytania.
A dzięki komentarzowi ya_dimon powyższy kod powinien być opakowany w IIFE, na przykład:
źródło
Niedawno też miałem tę zagadkę. Zacząłem tak jak ty, używając połączonej składni, ale na dłuższą metę staje się ona nieporęczna w przypadku dużych projektów. Zwykle tworzyłem moduł kontrolerów, moduł usług i tak dalej w oddzielnych plikach i wstawiam je do mojego głównego modułu aplikacji znajdującego się w innym pliku. Na przykład:
Ale każdy z tych plików stawał się coraz większy w miarę rozwoju projektu. Postanowiłem więc podzielić je na osobne pliki na podstawie każdego kontrolera lub usługi. Odkryłem, że użycie
angular.module('mod-name').
bez tablicy wtrysku jest tym, czego potrzebujesz, aby to zadziałało. Zadeklarowanie zmiennej globalnej w jednym pliku i oczekiwanie, że będzie ona łatwo dostępna w innym, po prostu nie działa lub może mieć nieoczekiwane rezultaty.Więc w skrócie moja aplikacja wyglądała mniej więcej tak:
Zrobiłem to również w pliku usług, nie trzeba zmieniać głównego pliku modułu aplikacji, do którego nadal będziesz wstrzykiwać te same moduły.
źródło
angular.module('my-controllers',[]);
(Zauważ, że określa [] tylko raz dla deklaracji). Po prostu wykorzystuje to ponownie w innych plikach. Separacja plików sprawia, że utrzymanie projektu, zwłaszcza dużych, jest stosunkowo łatwe.Inną praktyką jest umieszczanie kontrolerów, dyrektyw itp. W ich własnych modułach i wstawianie tych modułów do "głównego":
Nic nie pozostaje w zasięgu globalnym.
http://plnkr.co/edit/EtzzPRyxWT1MkhK7KcLo?p=preview
źródło
app.controllers
insted ofcontrollers
jako nazwy modułu, czy jest jakaś korzyść? Jestem nowicjuszem w AngularjsLubię dzielić moje pliki i moje moduły.
Coś takiego:
app.js
directives.js
service.js
Nie jestem wielkim fanem „stylu łańcuchowego”, więc wolę zawsze zapisywać swoją zmienną.
źródło
Proponuję postępować zgodnie z Przewodnikiem po stylu Angularjs .
Obsługują wszystkie koncepcje, od konwencji nazewnictwa po modularyzację aplikacji i tak dalej.
W przypadku Angular 2 możesz sprawdzić Przewodnik po stylu Angular 2
źródło
Dla mnie tworzenie łańcuchów to najbardziej kompaktowy sposób:
W ten sposób mogę łatwo przenosić komponenty między modułami, nigdy nie muszę dwukrotnie deklarować tego samego modułu, nigdy nie potrzebuję żadnych zmiennych globalnych.
A jeśli plik stanie się zbyt długi, rozwiązanie jest proste - podziel na dwa pliki, z których każdy deklaruje swój własny moduł u góry. Dla większej przejrzystości staram się zachować jeden unikalny moduł na plik i nazwać go tak, aby przypominał pełną ścieżkę do pliku. W ten sposób nigdy nie muszę pisać modułu bez
[]
, co jest częstym problemem.źródło