Mam wszystkie moje kontrolery AngularJS w jednym pliku, kontrolery.js. Plik ten ma następującą strukturę:
angular.module('myApp.controllers', [])
.controller('Ctrl1', ['$scope', '$http', function($scope, $http) {
}])
.controller('Ctrl2', ['$scope', '$http', function($scope, $http) }
}])
Chciałbym umieścić Ctrl1 i Ctrl2 w osobnych plikach. W takim razie dołączałbym oba pliki do pliku index.html, ale jak należy to uporządkować? Próbowałem zrobić coś takiego, co powoduje błąd w konsoli przeglądarki internetowej, mówiąc, że nie można znaleźć moich kontrolerów. Jakieś wskazówki?
Przeszukałem StackOverflow i znalazłem podobne pytanie - jednak ta składnia używa innej struktury (CoffeeScript) na Angularu, więc nie byłem w stanie tego śledzić.
źródło
appCtrl
jest globalnywindow.appCtrl
. To nie jest dobra praktyka.Użycie interfejsu API angular.module z tablicą na końcu powie angularowi utworzenie nowego modułu:
myApp.js
Używanie go bez tablicy jest właściwie funkcją gettera. Aby oddzielić kontrolery, możesz:
Ctrl1.js
Ctrl2.js
Podczas importowania javascript upewnij się, że myApp.js jest po AngularJS, ale przed wszystkimi kontrolerami / usługami itp. ... inaczej Angular nie będzie w stanie zainicjować twoich kontrolerów.
źródło
Chociaż obie odpowiedzi są technicznie poprawne, chcę wprowadzić inny wybór składni dla tej odpowiedzi. To imho ułatwia czytanie, co się dzieje z zastrzykiem, rozróżnianie itp.
Plik pierwszy
Plik drugi
Plik trzeci
źródło
Co z tym rozwiązaniem? Moduły i kontrolery w plikach (na końcu strony) Działa z wieloma kontrolerami, dyrektywami i tak dalej:
app.js
myCtrl.js
HTML
Google ma również zalecenia dotyczące najlepszych praktyk dotyczących struktury aplikacji Angular, które bardzo lubię grupować według kontekstu. Nie wszystkie pliki HTML w jednym folderze, ale na przykład wszystkie pliki do logowania (HTML, CSS, App.js, Controller.js i tak dalej). Więc jeśli pracuję nad modułem, łatwiej jest znaleźć wszystkie dyrektywy.
źródło
Dla zwięzłości, oto próbka ES2015, która nie opiera się na zmiennych globalnych
źródło
name
... więc możesz po prostu użyćExampleCtrl.name
zamiast duplikować ... trzykrotnie.Nie tak wdzięczne, ale bardzo proste w implementacji rozwiązanie - przy użyciu zmiennej globalnej.
W „pierwszym” pliku:
w „drugim”, „trzecim” itd.:
źródło
angular.module('myApp').controller('ProductCtrl', ['$scope', '$http', function($scope, $http){ //Your ProductCtrl code goes here }]);