Chcę wiedzieć, jak używać wielu kontrolerów dla jednej aplikacji strony. Próbowałem to rozgryźć i znalazłem pytania bardzo podobne do moich, ale jest tylko mnóstwo różnych odpowiedzi rozwiązujących konkretny problem, w którym nie używasz wielu kontrolerów dla jednej aplikacji strony.
Czy to dlatego, że nie byłoby mądrze używać wielu kontrolerów dla jednej strony? A może to po prostu niemożliwe?
Powiedzmy, że mam już niesamowity kontroler karuzeli obrazów działający na stronie głównej, ale potem uczę się (powiedzmy) używać modali i potrzebuję do tego nowego kontrolera (lub czegokolwiek innego, czego potrzebuję). Co wtedy zrobię?
Widziałem odpowiedzi na inne pytania, w których pytają o prawie to samo co ja, a ludzie odpowiadają „* OMG. Dlaczego w ogóle miałbyś to robić, po prostu zrób to ...”.
Jaki jest najlepszy sposób lub jak to robisz?
Edytować
Wielu z was odpowiada, aby po prostu zadeklarować dwa kontrolery, a następnie użyć ng-controller, aby to wywołać. Używam tego fragmentu kodu poniżej, a następnie wywołuję MainCtrl z kontrolerem ng.
app.config(function($routeProvider, $locationProvider) {
$routeProvider
.when('/', {
templateUrl: "templates/main.html",
controller:'MainCtrl',
})
.otherwise({
template: 'does not exists'
});
});
Dlaczego w ogóle muszę tutaj ustawiać kontroler, skoro mogę po prostu używać ng-kontrolera bez niego? To mnie zdezorientowało. (i myślę, że nie można w ten sposób dodać dwóch kontrolerów ...)
źródło
when: /home, controller: MainCtrl
. nie możesz dodać nic więcej, czy też masz na myśli po prostu wywołać to za pomocą kontrolera ng?Odpowiedzi:
Jaki jest problem? Aby użyć wielu kontrolerów, po prostu użyj wielu dyrektyw ngController:
Jak zwykle będziesz musiał mieć dostępne kontrolery w module aplikacji.
Najprostszym sposobem, aby to zrobić, może być tak proste, jak zadeklarowanie funkcji kontrolera w następujący sposób:
źródło
when /home, controller: MainCtrl
ng-controller
w wielu elementach DOM, jest scenariusz, w którym mam WIELE elementów drukujących do DOM za pośrednictwemng-repeat
. Powiedzmy, że każdy z nich nawiązuje połączenieng-controller="myController
. Z niektórych dzienników konsoli, które widziałem w mojej aplikacji,myController
inicjuje się ponownie, gdy KAŻDY element jest renderowany w DOM, który go wywołuje ... Może coś spieprzyłem w moim konkretnym zastosowaniu, a może poza zakresem OP pytanie, ale ciekawi, czy inni też tego doświadczyli ...Myślę, że brakuje Ci znaczenia „aplikacja pojedynczej strony”.
Nie oznacza to, że będziesz mieć fizycznie jeden
index.html
plik .html, zamiast tego będziesz mieć jeden plik główny i kilka ZGNIEŻDZONYCH .html. Dlaczego więc aplikacja z jedną stroną? Ponieważ w ten sposób nie ładujesz stron w standardowy sposób (tj. Wywołanie przeglądarki, które całkowicie odświeża całą stronę), ale po prostu ładujesz część treści za pomocą Angular / Ajax. Ponieważ nie widzisz migotania między zmianami strony, masz wrażenie, że nie ruszyłeś się ze strony. W ten sposób czujesz się, jakbyś przebywał na jednej stronie.Teraz zakładam, że chcesz mieć WIELE treści dla swojej aplikacji JEDNOSTRONNE: (np.) Dom, kontakty, portfolio i sklep. Twoja pojedyncza strona / aplikacja zawierająca wiele treści (w sposób kątowy) zostanie zorganizowana w ten sposób:
index.html
: zawiera nagłówek<ng-view>
i stopkęcontacts.html
: zawiera formularz kontaktowy (bez nagłówka, bez stopki)portfolio.html
: zawiera dane portfela (bez nagłówka bez stopki)store.html
: zawiera sklep, bez nagłówka, bez stopki.Jesteś w indeksie, klikasz na menu o nazwie "kontakty" i co się dzieje? Angular zastępuje
<ng-view>
tagcontacts.html
kodemJak to osiągasz? z
ngRoute
, jak to robisz, będziesz miał coś takiego:Spowoduje to wywołanie odpowiedniego kodu HTML i przekazanie do niego odpowiedniego kontrolera (uwaga: nie określaj
ng-controller
dyrektywy w,contacts.html
jeśli używasz tras )Następnie możesz oczywiście zadeklarować tyle dyrektyw ng-controller na swojej stronie contacts.html. Będą to dzieci-kontrolerzy
ContactCtrl
(w ten sposób dziedziczący po nim). Ale dla pojedynczej trasy, wewnątrzrouteProvider
, możesz zadeklarować pojedynczego Kontrolera, który będzie działał jako „Ojciec kontroler częściowego widoku”.EDYCJA Wyobraź sobie następujące szablony / contacts.html
powyższe
routeProvider
spowoduje wstrzyknięcie kontrolera do zawierającego div. Zasadniczo powyższy html automatycznie staje się:Kiedy mówię, że możesz mieć inne kontrolery, oznacza to, że możesz podłączyć kontrolery do wewnętrznych elementów DOM, w następujący sposób:
Mam nadzieję, że to trochę wyjaśnia sprawę.
ZA
źródło
<div ng-controller="FancyStuffController">
Wewnątrz tagu body, do którego jest już dołączony kontroler, np.<body ng-controller="BodyController">
To zadziała? Otrzymuję błędy o tym,$apply already in progress
kiedy to robię, ale myślę, że jest to związane z dpd.js. Nie wchodząc w to, myślę, że po prostu ładuje go dwa razy lub coś w tym stylu, nie wiem jak, ale moje użycie kontrolera może próbować to przeładować.Obecnie jestem w trakcie tworzenia aplikacji jednostronicowej. Oto, co mam do tej pory, co moim zdaniem byłoby odpowiedzią na twoje pytanie. Mam szablon podstawowy (base.html), który zawiera element div z
ng-view
dyrektywą w nim. Ta dyrektywa mówi angularowi, gdzie umieścić nową zawartość. Zauważ, że sam jestem nowy w angularjs, więc w żadnym wypadku nie mówię, że to najlepszy sposób na zrobienie tego.base.html
źródło
when /home
when
. Potrzebuję dwóch kontrolerów dla jednego szablonu. Albo może źle zrozumiałem, co próbujesz mi powiedzieć?menuController ma dostęp do menu div. A widgetController ma dostęp do obu.
źródło
Możemy po prostu zadeklarować więcej niż jeden kontroler w tym samym module. Oto przykład:
źródło
Po prostu umieściłem jedną prostą deklarację aplikacji
Następnie zbudowałem jedną usługę i dwa kontrolery
Dla każdego kontrolera miałem wiersz w JS
W kodzie HTML zadeklarowałem zakres aplikacji w otaczającym go div
i każdy zakres kontrolera osobno w swoim własnym otaczającym div (w aplikacji div)
To działało dobrze
źródło
Możesz także osadzić wszystkie widoki szablonu w głównym pliku HTML. Na przykład:
W ten sposób, jeśli każdy szablon wymaga innego kontrolera, nadal możesz używać routera kątowego. Zobacz ten działający przykład http://plnkr.co/edit/9X0fT0Q9MlXtHVVQLhgr?p=preview
W ten sposób, gdy aplikacja zostanie wysłana z serwera do klienta, jest całkowicie samowystarczalna przy założeniu, że nie musi wysyłać żadnych żądań danych itp.
źródło