W tej chwili mam aplikację, która ma pasek boczny, a pasek boczny ładuje różne szablony html przy użyciu ng-include
w zależności od tego, jaką operację użytkownik wybierze. Jest to mapa związane app, tak na przykład, jeśli użytkownik wybierze przycisk „Dodaj Leg” będzie załadować szablon add_leg.html
na pasku bocznym przy użyciu ng-include
:Dynamicznie ładowane kontrolery i ng-include
// The Javascript code:
$scope.addLeg = function() {
$scope.sidebar = true;
$scope.sidebar_template = '/partials/legs/add_leg.html';
}
// Simplified example of HTML:
<html>
<div ng-app="MyApp" ng-controller="MainCtrl">
<a ng-click="addLeg()">Add Leg</a>
<a ng-click="addRoute()">Add Route</a>
<a ng-click="editLeg()">Edit Leg</a>
<a ng-click="editRoute()">Edit Route</a>
...
<div id="sidebar" ng-class="{'sidebar-hidden': sidebar == false}">
<div ng-include src="sidebar_template"></div>
</div>
<google-map></google-map>
</div>
To jest wszystko dobrze i działa zgodnie z oczekiwaniami, ale w tej chwili moja aplikacja używa tylko jednego kontrolera (MainCtrl
w js/controllers.js
) i zaczyna być naprawdę zagracona. Mam teraz wiele metod, ponieważ funkcjonalność aplikacji się rozszerza. Chciałbym podzielić mój kontroler na wiele kontrolerów jednocześnie zachowując funkcjonalność paska bocznego.
Chcę mieć MainCtrl
jako główny kontroler, który kontroluje ładowanie szablonu paska bocznego (zmieniając zmienną sidebar_template
wskazującą miejsce docelowe pliku) i chcę, aby kontrolowała niektóre z metod związanych z mapami globalnymi (np. pobieranie nazw przedmieść ze współrzędnych, itp.).
Próbowałam podzielić ją tak:
controllers/js/main.js - MainCtrl
controllers/js/legs.js - LegCtrl
controllers/js/routes.js - RouteCtrl
chcę LegCtrl
i RouteCtrl
odziedziczyć MainCtrl
więc mogę uzyskać dostęp do jego zakresu i metod, to wszystko w porządku. Ale teraz problem polega na tym, jak dynamicznie ładować kontroler na pasek podziału paska bocznego w zależności od wymaganej funkcjonalności. Oryginalnie wszystkie moje metody były w MainCtrl
, a to na opakowaniu div, który otacza div paska bocznego (patrz wyżej na przykład), więc nie było problemu.
Na przykład, powiedzmy naciśnięciu przycisku „Dodaj Leg”, to będzie trzeba zadzwonić addLeg
w LegCtrl
, ale LegCtrl
nie jest załadowany w aplikacji, więc nie ma dostępu do tej metody. Mogę przechowywać addLeg()
wewnątrz i zmienić tę zmienną na sidebar_template
, aby załadować szablon, ale nic w szablonie nie zadziała, ponieważ teraz wywołuje metody z wnętrza LegCtrl
.
muszę jakoś dynamicznie ładować kontroler na pasku bocznym w ng-include
div, coś takiego może:
// MainCtrl
$scope.addLeg = function() {
$scope.required_controller = LegCtrl;
$scope.sidebar = true;
$scope.sidebar_template = '/partials/legs/add_leg.html';
LegCtrl.addLeg();
}
<div id="sidebar" ng-class="{'sidebar-hidden': sidebar == false}">
<div ng-include src="sidebar_template" ng-controller="{{required_controller}}"></div>
</div>
W nieprodukcyjnym powyższym przykładzie widać możliwe rozwiązanie myślałem o, ale Potrzebuję LegCtrl
, aby być rzeczywistą funkcją kontrolera, a nie obiektu (aby działał ng-controller
). Potrzebuję również sposób na wywołanie addLeg
na LegCtrl
z MainCtrl.addLeg
(być może za pomocą transmisji?).
Jeśli ktokolwiek może wskazać mi właściwy kierunek, to byłoby wspaniale. Przepraszam za ogromny post, ale trzeba trochę wyjaśnić, żeby był spójny. Mam nadzieję, że ma to sens. Dzięki.
Aktualizacja: Chyba znalazłem rozwiązanie używając usługę działać jako kontrolę nawigacji (będzie ładować odpowiednich szablonów i nadawane zdarzenie do nowego kontrolera są załadowane dynamicznie, aby poinformować go, co do wykonywania funkcji):
http://plnkr.co/edit/Tjyn1OiVvToNntPBoH58?p=preview
Właśnie próbuje przetestować ten pomysł się teraz, ale transmisja .on
nie działa.Myślę, że dzieje się tak dlatego, że emisja jest uruchamiana przed załadowaniem szablonu. Jak mogę to naprawić? Czy to dobre rozwiązanie dla tego, co robię?
Widziałem twój plunker i edytowałem go, aby dołączyć do wiadomości konsoli. Pokaże ci, że wydarzenie jest publikowane jako pierwsze, a następnie słuchacz zaczyna nasłuchiwać. Dzieje się tak, ponieważ wszystko jest leniwie załadowane w kanciastej aplikacji. http://plnkr.co/edit/rWZ3x2Jzk9EV3OpD1HF1?p=preview –