С ui-router
помощью можно ввести любой $state
или $stateParams
в контроллер, чтобы получить доступ к параметрам в URL-адресе. Однако доступ к параметрам через $stateParams
только предоставляет параметры, принадлежащие состоянию, управляемому контроллером, который обращается к нему, и его родительским состояниям, в то время как $state.params
имеет все параметры, в том числе в любых дочерних состояниях.
С учетом следующего кода, если мы загружаем URL напрямую, при загрузке http://path/1/paramA/paramB
контроллеров все происходит следующим образом:
$stateProvider.state('a', {
url: 'path/:id/:anotherParam/',
controller: 'ACtrl',
});
$stateProvider.state('a.b', {
url: '/:yetAnotherParam',
controller: 'ABCtrl',
});
module.controller('ACtrl', function($stateParams, $state) {
$state.params; // has id, anotherParam, and yetAnotherParam
$stateParams; // has id and anotherParam
}
module.controller('ABCtrl', function($stateParams, $state) {
$state.params; // has id, anotherParam, and yetAnotherParam
$stateParams; // has id, anotherParam, and yetAnotherParam
}
Спрашивается, а в чем разница? И есть ли рекомендации по передовому опыту, когда и почему вам следует использовать или избегать использования любого из них?
angularjs
angular-ui-router
Merott
источник
источник
Ответы:
В документации повторяются ваши выводы здесь: https://github.com/angular-ui/ui-router/wiki/URL-Routing#stateparams-service
Если мне не изменяет память, он
$stateParams
был представлен позже оригинала$state.params
и кажется простым вспомогательным инжектором, позволяющим избежать непрерывной записи$state.params
.Я сомневаюсь, что существуют какие-либо рекомендации по передовой практике, но для меня важен контекст. Если вам просто нужен доступ к параметрам, полученным в URL-адресе, используйте
$stateParams
. Если вы хотите узнать что-то более сложное о самом состоянии, используйте$state
.источник
$state.params
inACtrl
, потому что хотел проверить, установлен лиyetAnotherParam
он. Так что если это не так, я могу что-нибудь сделать. Я не буду вдаваться в подробности этого явления, поскольку это может вызвать самостоятельный вопрос. Однако я чувствую, что, возможно, делаю хакерство , проверяя параметр, который вводится дочерним состоянием и не распознается текущим состоянием через$stateParams
. С тех пор я нашел альтернативный подход.parent.child
, то$stateParams
inparentController
будет оценивать параметры на основе urlparent
, но не параметрыparent.child
. См. Эту проблему .$stateParams
работает в разрешении, а$state.params
неверно (не отображаются параметры для состояния, которое еще не решено)Еще одна причина для использования
$state.params
- это состояние, не основанное на URL-адресах, которое (на мой взгляд) крайне недокументировано и очень мощно.Я только что обнаружил это, когда гуглил о том, как передать состояние, не раскрывая его в URL-адресе, и ответил на вопрос в другом месте на SO.
По сути, он позволяет использовать такой синтаксис:
источник
РЕДАКТИРОВАТЬ: этот ответ верен для версии
0.2.10
. Как отметил @Alexander Vasilyev, в версии это не работает0.2.14
.Еще одна причина для использования
$state.params
- это когда вам нужно извлечь такие параметры запроса:источник
Между этими двумя есть много различий. Но, работая практически, я обнаружил, что использовать
$state.params
лучше. Когда вы используете все больше и больше параметров, это может быть сложно поддерживать$stateParams
. где, если мы используем несколько параметров, которые не являются параметрами URL,$state
очень полезноисточник
У меня есть корневое состояние, которое разрешает что-то. Передача
$state
в качестве параметра разрешения не гарантирует доступность для$state.params
. Но используя$stateParams
волю.Использование "angular": "~ 1.4.0", "angular-ui-router": "~ 0.2.15"
источник
Интересное наблюдение, которое я сделал при передаче параметров предыдущего состояния с одного маршрута на другой, заключается в том, что $ stateParams поднимается и перезаписывает параметры состояния предыдущего маршрута, которые были переданы с параметрами текущего состояния, но при использовании
$state.param
s этого не происходит.При использовании
$stateParams
:При использовании $ state.params:
источник
Здесь в этой статье четко объясняется:
$state
Служба предоставляет ряд полезных методов для управления состоянием, а также соответствующие данные о текущем состоянии. Параметры текущего состояния доступны на$state
сервисе по ключу params.$stateParams
Служба возвращает это тот же самый объект. Следовательно, эта$stateParams
служба является исключительно удобной службой для быстрого доступа к объекту params на$state
службе.Таким образом , ни один контроллер никогда не должен вводить как
$state
сервис и его обслуживание удобства$stateParams
. Если$state
вводится только для доступа к текущим параметрам,$stateParams
вместо этого контроллер следует переписать на ввод .источник