Невозможно получить параметры состояния ui-маршрутизатора
-
21-12-2019 - |
Вопрос
Рассмотрим следующую конфигурацию ui-маршрутизатора:
$stateProvider
.state('app', {
url: "/app",
abstract: true,
templateUrl: "templates/menu.html",
controller: 'AppCtrl'
})
.state('app.feed', {
url: "/feed",
views: {
'menuContent': {
templateUrl: "templates/feed.html",
controller: "FeedCtrl"
}
}
})
В моем приложении есть следующая ссылка:
<a ui-sref="app.feed({ feedId: 5 })">My Link</a>
Я пытаюсь получить feedId
в параметрах состояния:
angular.module('MyApp').controller('FeedCtrl', function($state) {
console.log($state.params);
});
Но, к сожалению, $state.params
всегда {}
.
Что я делаю не так?
БОНУСНЫЙ ВОПРОС
Я жду FeedCtrl
инициализироваться каждый раз, когда я нажимаю на ссылку, т.е.каждый раз, когда состояние изменяется на app.feed
.Итак, если я переключусь между app.feed
штат и какой-то другой штат несколько раз, я ожидаю, что console.log
выше, чтобы запустить несколько раз.Но похоже, что ui-router инициализируется FeedCtrl
только один раз.Почему?
Решение
Чтобы передать параметр, мы должны его определить:
.state('app.feed', {
url: "/feed/{feedId}",
views: {
'menuContent': {
templateUrl: "templates/feed.html",
controller: "FeedCtrl"
}
}
В данном случае мы определяем его как {feedId}
Посмотреть больше здесь
Некоторые примеры:
'/user/{id:[^/]*}'
- Такой же как'/user/{id}'
из предыдущего примера.'/user/{id:[0-9a-fA-F]{1,8}}'
— Аналогично предыдущему примеру, но соответствует только в том случае, если параметр id содержит от 1 до 8 шестнадцатеричных цифр.'/files/{path:.*}'
– Сопоставляет любой URL-адрес, начинающийся с «/files/», и записывает остальную часть пути в параметр «path».'/files/*path'
- То же самое.Специальный синтаксис для охвата всего.
Если у нас определен параметр, и мы будем перемещаться между состояниями с разными feedId
ценности...мы действительно увидим, что этот контроллер FeedCtrl
возобновляется.Вот как ui-router
был разработан