В нашем приложении двухуровневая навигация. Мы хотим использовать AngularJS $routeProvider
для динамического предоставления шаблонов для <ng-view />
. Я подумывал сделать что-то вроде этого:
angular.module('myApp', []).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/:primaryNav/:secondaryNav', {
templateUrl: 'resources/angular/templates/nav/'+<<primaryNavHere>>+'/'+<<secondaryNavHere>>+'.html'
});
}]);
Я просто не знаю, как заполнить части внутри <<>>
. Я знаю, что primaryNav и secondaryNav привязаны к $ routeParams, но как мне получить здесь доступ к $ routeParams, чтобы динамически обслуживать шаблон?
источник
config()
передаются только поставщикам, а не фактическим экземплярам службы, например$routePrams
.template
вместоtemplateUrl
?template
на функцию, вы можете передать$routeParams
в эту функцию:$routeProvider.when('/:pNav/:sNav', { template: fn($routeParams) { return $routeParams.pNav + '/' + $routeParams.sNav + '.html' } });
. Однако вы не можете динамически определить контроллер таким образом :(Эта очень полезная функция теперь доступна начиная с версии 1.1.2 AngularJS. Он считается нестабильным, но я использовал его (1.1.3), и он отлично работает.
В основном вы можете использовать функцию для генерации строки templateUrl. В функцию передаются параметры маршрута, которые можно использовать для построения и возврата строки templateUrl.
Большое спасибо https://github.com/lrlopez за пулреквест.
https://github.com/angular/angular.js/pull/1524
источник
controllers
...?templateUrl можно использовать как функцию с возвращением сгенерированного URL. Мы можем управлять URL-адресом, передавая аргумент, который принимает routeParams.
См. Пример.
Надеюсь на эту помощь.
источник
Хорошо, думаю, я понял ...
Сначала немного предыстории: причина, по которой мне это было нужно, заключалась в том, чтобы закрепить Angular поверх Node Express и заставить Jade обрабатывать мои частичные файлы за меня.
Итак, вот что нужно сделать ... (сначала выпейте пива и потратите на это 20+ часов !!!) ...
Когда вы настраиваете свой модуль, сохраните
$routeProvider
глобально:Это может быть больше информации, чем нужно ...
По сути, вы хотите хранить
$routeProvider
var вашего модуля глобально, например,routeProvider
чтобы он был доступен вашим контроллерам.Затем вы можете просто использовать
routeProvider
и создать НОВЫЙ маршрут (вы не можете 'RESET a route' / 'REpromise'; вы должны создать новый), я просто добавил косую черту (/) в конце, чтобы он был семантическим как первый.Затем (внутри вашего контроллера) установите
templateUrl
вид, который вы хотите поразить.Выньте
controller
свойство.when()
объекта, чтобы не получить бесконечный цикл запроса.И, наконец (все еще внутри контроллера), используйте
$location.path()
для перенаправления на только что созданный маршрут.Если вас интересует, как вставить приложение Angular в приложение Express, вы можете разветвить мое репо здесь: https://github.com/cScarlson/isomorph .
И этот метод также позволяет вам сохранить двунаправленные привязки данных AngularJS на случай, если вы хотите привязать свой HTML к своей базе данных с помощью WebSockets: в противном случае без этого метода ваши привязки данных Angular будут просто выводиться
{{model.param}}
.Если вы клонируете это сейчас, вам понадобится mongoDB на вашем компьютере для его запуска.
Надеюсь, это решит эту проблему!
Коди
Не пейте воду из ванны.
источник
Маршрутизатор: -
Контроллер: -
Я считаю, что слабость angularjs в том, что $ routeParams НЕ виден внутри маршрутизатора. Небольшое усовершенствование существенно изменит ситуацию во время реализации.
источник
Я добавил поддержку этого в свой форк angular. Это позволяет вам указать
https://github.com/jamie-pate/angular.js/commit/dc9be174af2f6e8d55b798209dfb9235f390b934
не уверен, что это будет воспринято, так как это не в духе для angular, но для меня это полезно
источник
в index.html
firstParam и secondParam могут быть любыми в соответствии с вашими потребностями.
источник
У меня была аналогичная проблема, и я использовал
$stateParams
вместоrouteParam
источник