Nasza aplikacja posiada 2 poziomy nawigacji. Chcemy używać AngularJS $routeProvider
do dynamicznego dostarczania szablonów do pliku <ng-view />
. Myślałem o zrobieniu czegoś podobnego do tego:
angular.module('myApp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/:primaryNav/:secondaryNav', {
templateUrl: 'resources/angular/templates/nav/'+<<primaryNavHere>>+'/'+<<secondaryNavHere>>+'.html'
});
}]);
Po prostu nie wiem, jak wypełnić części w <<>>
. Wiem, że primaryNav i secondNav są powiązane z $ routeParams, ale jak uzyskać dostęp do $ routeParams tutaj, aby dynamicznie udostępniać szablon?
źródło
config()
są przekazywane tylko do dostawców, a nie rzeczywiste wystąpienia usługi, takie jak$routePrams
.template
zamiasttemplateUrl
?template
do funkcji, można przejść$routeParams
do tej funkcji:$routeProvider.when('/:pNav/:sNav', { template: fn($routeParams) { return $routeParams.pNav + '/' + $routeParams.sNav + '.html' } });
. Nie możesz jednak dynamicznie zdefiniować kontrolera w ten sposób :(Ta bardzo pomocna funkcja jest teraz dostępna począwszy od wersji 1.1.2 AngularJS. Jest uważany za niestabilny, ale używałem go (1.1.3) i działa dobrze.
Zasadniczo możesz użyć funkcji do wygenerowania ciągu templateUrl. Do funkcji przekazywane są parametry trasy, których można użyć do zbudowania i zwrócenia ciągu templateUrl.
Dziękujemy https://github.com/lrlopez za pull request.
https://github.com/angular/angular.js/pull/1524
źródło
controllers
...?Szablon templateUrl może służyć jako funkcja zwracająca wygenerowany adres URL. Możemy manipulować url przekazując argument, który przyjmuje routeParams.
Zobacz przykład.
Mam nadzieję, że to pomoże.
źródło
W porządku, myślę, że to rozumiem ...
Najpierw małe tło: potrzebowałem tego, aby przykleić Angular na wierzchu Node Express i poprosić Jade o przetworzenie za mnie moich stron.
Więc oto co muszę zrobić ... (najpierw pij piwo i spędź na nim ponad 20 godzin !!!) ...
Podczas konfigurowania modułu zapisz
$routeProvider
globalnie:To może być więcej informacji, niż było potrzebne ...
Zasadniczo będziesz chciał przechowywać zmienne swojego modułu
$routeProvider
globalnie, np.routeProvider
Tak, aby były dostępne dla twoich kontrolerów.Następnie możesz po prostu użyć
routeProvider
i utworzyć NOWĄ trasę (nie możesz 'ZRESETOWAĆ trasy' / 'REpromise'; musisz utworzyć nową), po prostu dodałem ukośnik (/) na końcu, aby była tak semantyczna jako pierwszy.Następnie (wewnątrz kontrolera) ustaw
templateUrl
widok, w który chcesz trafić.Usuń
controller
właściwość.when()
obiektu, aby nie uzyskać nieskończonej pętli żądań.I na koniec (nadal w kontrolerze) użyj,
$location.path()
aby przekierować do właśnie utworzonej trasy.Jeśli interesuje Cię, jak włożyć aplikację Angular do aplikacji Express, możesz rozwidlić moje repozytorium tutaj: https://github.com/cScarlson/isomorph .
Ta metoda pozwala również zachować dwukierunkowe powiązania danych AngularJS na wypadek, gdybyś chciał powiązać swój kod HTML z bazą danych za pomocą WebSockets: w przeciwnym razie bez tej metody twoje wiązania danych Angular będą po prostu wyprowadzane
{{model.param}}
.Jeśli sklonujesz to teraz, będziesz potrzebować mongoDB na swoim komputerze, aby go uruchomić.
Mam nadzieję, że to rozwiązuje ten problem!
Cody
Nie pij swojej kąpieli.
źródło
Router: -
Kontroler:-
Uważam, że wadą angularjs jest to, że $ routeParams NIE jest widoczna wewnątrz routera. Drobne ulepszenie spowodowałoby ogromną różnicę podczas wdrażania.
źródło
Dodałem obsługę tego w moim rozwidleniu kątowym. Pozwala określić
https://github.com/jamie-pate/angular.js/commit/dc9be174af2f6e8d55b798209dfb9235f390b934
nie jestem pewien, czy to zostanie podniesione, ponieważ jest trochę pod kątem dla kątów, ale jest dla mnie przydatne
źródło
w index.html
firstParam i secondParam mogą być dowolne w zależności od potrzeb.
źródło
Miałem podobny problem i
$stateParams
zamiastrouteParam
źródło