Есть ли способ получить предыдущее состояние текущего состояния?
Например, я хотел бы знать, каким было предыдущее состояние перед текущим состоянием B (где предыдущее состояние было бы состоянием A).
Я не могу найти его на страницах документации github ui-router.
Ответы:
ui-router не отслеживает предыдущее состояние после его перехода, но событие
$stateChangeSuccess
транслируется$rootScope
при изменении состояния.Вы должны быть в состоянии поймать предыдущее состояние из этого события (
from
это состояние, которое вы покидаете):источник
Я использую решимость, чтобы сохранить данные текущего состояния перед переходом в новое состояние:
источник
$stateChangeSuccess
$stateChangeSuccess
работает, оно делает это на глобальном уровне, который на самом деле не требуется большую часть времени.$state.current
является объектом:{name: "", url: "^", views: null, abstract: true}
.Для удобства чтения я разместу свое решение (основанное на ответе stu.salsbury) здесь.
Добавьте этот код в абстрактный шаблон вашего приложения, чтобы он работал на каждой странице.
Отслеживает изменения в rootScope. Это очень удобно.
источник
В следующем примере я создал
decorator
(запускается только один раз для каждого приложения на этапе настройки) и добавляет дополнительное свойство к$state
сервису, поэтому этот подход не добавляет глобальные переменные$rootscope
и не требует добавления какой-либо дополнительной зависимости к другим сервисам, кроме$state
.В моем примере мне нужно было перенаправить пользователя на страницу индекса, когда он уже вошел в систему и когда он не должен был перенаправлять его на предыдущую «защищенную» страницу после входа в систему.
Единственный неизвестные услуги (для вас) , которые я использую,
authenticationFactory
иappSettings
:authenticationFactory
просто администрирует логин пользователя. В этом случае я использую только метод, чтобы определить, вошел ли пользователь в систему или нет.appSettings
являются константами только для того, чтобы не использовать строки везде.appSettings.states.login
иappSettings.states.register
содержат название государства для логина и регистрации URL.Затем в любой
controller
/service
etc вам нужно внедрить$state
сервис, и вы можете получить доступ к текущему и предыдущему URL, например так:$state.current.name
$state.previous.route.name
Из консоли Chrome:
Реализация:
(Я пользуюсь
angular-ui-router v0.2.17
иangularjs v1.4.9
)источник
Добавьте новое свойство с именем {previous} в $ state на $ stateChangeStart
Теперь везде, где вам нужно, можно использовать $ state, у вас будет предыдущий доступный
И используйте это так:
источник
Я застрял с той же проблемой и нахожу самый простой способ сделать это ...
ИЛИ
(Если вы хотите, чтобы он был более тестируемым, вставьте службу $ window в ваш контроллер и используйте $ window.history.back ()).
источник
Я использую подобный подход к тому, что делает Энди Тяхджоно.
Что я делаю, чтобы сохранить значение текущего состояния перед выполнением перехода. Давайте посмотрим на примере; представьте себе это внутри функции, выполняемой при клике на то, что вызывает переход:
Ключевым моментом здесь является объект params (карта параметров, которые будут отправлены в штат) ->
{ previousState : { name : $state.current.name } }
Примечание: обратите внимание, что я только «сохраняю» атрибут name объекта $ state, потому что это единственное, что мне нужно для сохранения состояния. Но мы могли бы иметь целый государственный объект.
Затем укажите «что бы» ни было определено так:
Здесь ключевым моментом является объект params.
Затем внутри этого состояния мы можем получить предыдущее состояние следующим образом:
источник
Вот действительно элегантное решение от Chris Thielen ui-router-extras: $ previousState
previous
это объект, который выглядит следующим образом:{ state: fromState, params: fromParams }
где fromState - предыдущее состояние, а fromParams - параметры предыдущего состояния.источник
Хорошо, я знаю, что я опаздываю на вечеринку здесь, но я новичок в angular. Я пытаюсь вписать это в руководство по стилю Джона Папы здесь. Я хотел сделать это многоразовым, поэтому я создал в блоке. Вот что я придумал:
previousStateProvider
core.module
core.config
Любая критика в этом коде только поможет мне, поэтому, пожалуйста, дайте мне знать, где я могу улучшить этот код.
источник
Если вам просто нужна эта функциональность и вы хотите использовать ее более чем в одном контроллере, это простой сервис для отслеживания истории маршрутов:
где «core» в .module («core») будет названием вашего приложения / модуля. Требовать сервис как зависимость от вашего контроллера, тогда в вашем контроллере вы можете сделать:
$scope.routeHistory = RouterTracker.getRouteHistory()
источник
Я отслеживаю предыдущие состояния в $ rootScope , поэтому при необходимости я просто вызываю приведенную ниже строку кода.
В App.js :
источник
Для UI-Router (> = 1.0) события StateChange устарели. Для полного руководства по миграции, нажмите здесь
Чтобы получить предыдущее состояние текущего состояния в UI-Router 1.0+:
источник
Действительно простое решение - просто отредактировать строку $ state.current.name и вырезать все, включая и после последнего '.' - вы получите название родительского штата. Это не работает, если вы много перепрыгиваете между состояниями, потому что он просто анализирует текущий путь. Но если ваши состояния соответствуют тому, где вы на самом деле находитесь, то это работает.
источник
$state.go('^')
выполню этоВы можете вернуть состояние следующим образом:
Пример:
источник