Угловой UI-маршрутизатор Вложенное разрешение штата в дочерних штатах

В угловом приложении, над которым я работаю, я хочу, чтобы там было абстрактное родительское состояние, которое должно разрешать определенные зависимости для всех его дочерних состояний. В частности, я хотел бы, чтобы все состояния требовали, чтобы аутентифицированный пользователь наследовал эту зависимость от некоторого состояния authroot.

У меня проблемы с родительской зависимостью, которая не всегда решается. В идеале, я хотел бы, чтобы родительское состояние проверяло, что пользователь все равно регистрируется для любого дочернего состояния автоматически. В документах говорится:

Дочерние состояния наследуют разрешенные зависимости от родительского состояния (состояний), которые они могут перезаписать.

Я обнаружил, что родительская зависимость решается только тогда, когда я ввожу какое-либо дочернее состояние из состояния вне родителя, но не при перемещении между состояниями сестры.

В этом примере, если вы перемещаете между состояниями authroot.testA и authroot.testB, метод GetUser вызывается только один раз. Когда вы перейдете в other состояние и обратно, он снова запустится.

Я могу установить зависимость User от каждого из дочерних состояний, чтобы гарантировать, что метод вызывается каждый раз, когда вы вводите какое-либо из этих состояний, но это, похоже, преследует цель унаследованной зависимости.

Я неправильно понимаю документы? Есть ли способ заставить родительское состояние повторно решать свои зависимости, даже когда состояние изменяется между братьями и сестрами?

jsfiddle

       (function(ng) { var app = ng.module("Test", ["ui.router"]); app.config(["$stateProvider", "$urlRouterProvider", function(sp, urp) { urp.otherwise("/testA"); sp.state("authroot", { abstract: true, url: "", template: "
", resolve: {User: ["UserService", function(UserService) { console.log("Resolving dependency..."); return UserService.GetUser(); }]} }); sp.state("authroot.testA", { url: "/testA", template: "

Test A {{User|json}}

", controller: "TestCtrl" }); sp.state("authroot.testB", { url: "/testB", template: "

Test B {{User|json}}

", controller: "TestCtrl" }); sp.state("other", { url: "/other", template: "

Other

", }); }]); app.controller("TestCtrl", ["$scope", "User", function($scope, User) {$scope.User = User;}]); app.factory("UserService", ["$q", "$timeout", function($q, $timeout) { function GetUser() { console.log("Getting User information from server..."); var d = $q.defer(); $timeout(function(){ console.log("Got User info."); d.resolve({UserName:"JohnDoe1", OtherData: "asdf"}); }, 500); return d.promise; }; return { GetUser: GetUser }; }]); })(window.angular); Goto A Goto B Goto Other
Loading...

То, как я нахожу ui-router исключительным, – это поведение, которое вы только что описали.

Давайте подумаем о каком-то объекте, например Contact. Поэтому было бы неплохо иметь правую сторону, показывающую нам список контактов, левую часть детали. Пожалуйста, ознакомьтесь с Основами использования ui-router с помощью AngularJS для быстрого опроса макета. Цитата:

ui-router полностью охватывает государственную машину системы маршрутизации. Он позволяет определять состояния и переводить ваше приложение в эти состояния. Реальная победа заключается в том, что она позволяет отделить вложенные состояния и сделать несколько очень сложных макетов элегантным способом.

Вам нужно подумать о своей маршрутизации немного по-другому, но как только вы пойдете вокруг государственного подхода, я думаю, вам понравится.

Хорошо, почему все это?

Потому что у нас может быть Contact представляющий список. Скажите фиксированный список с точки зрения детали . (Пропустить фильтрацию пейджинга сейчас). Мы можем щелкнуть по списку и перейти в состояние Contact.Detail(ID) , чтобы увидеть только выбранный элемент. Затем выберите другой контакт / элемент.

Здесь преимущество преимуществ вложенных состояний:

Список ( Contact состояния) не перезагружается. Пока дочерний Contact.Detail .

Это должно объяснить, почему «странное» поведение следует рассматривать как правильное.

Чтобы ответить на ваш вопрос, как обрабатывать состояние пользователя. Я бы использовал несколько очень старших родственников состояния маршрута, с его разделенным представлением и controllerом и некоторым жизненным циклом arround … срабатывающим в некоторых циклах

Настоящий короткий ответ – использование:

$rootScope.$on("$stateChangeStart")

прослушивать любые изменения области и выполнять соответствующие действия.

Ответ более длинный, посмотрите скрипку: http://jsfiddle.net/jasallen/SZGjN/1/

Обратите внимание, что я использовал app.run, что означает, что я разрешаю пользователю для каждого изменения состояния. Если вы хотите ограничить его изменениями состояния, в то время как authRoot находится в родительском состоянии, поместите проверку для $stateChangeStart в controller authRoot.

  • Ввод $ state (ui-router) в $ http-перехватчик вызывает циклическую зависимость
  • Путают $ locationChangeSuccess и $ stateChangeStart
  • Угловой UI-маршрутизатор Как создать «макет»?
  • Как не изменять URL-адрес при отображении страницы ошибки 404 с помощью ui-router
  • Вложенные состояния или представления для макета с помощью leftbar в ui-router?
  • путь динамического шаблона ui-router
  • Угловой и UI-маршрутизатор, как установить динамический шаблонUrl
  • Как отправлять и извлекать параметры с помощью $ state.go toParams и $ stateParams?
  • Угловой UI-маршрутизатор - вложенные состояния с несколькими макетами
  • Interesting Posts

    Можете ли вы разбить / разбить поле в запросе MySQL?

    Производительность 2-мерного массива по сравнению с одномерным массивом

    Сертификаты SSL привязаны к IP-адресу серверов?

    Использование сборки с ассоциацией has_one в рельсах

    Ошибка: существует табличное пространство для таблицы xxx. Пожалуйста, ОТКРЫВАЙТЕ табличное пространство до ИМПОРТА

    Вкладки в браузере Chrome слишком сильно сжаты

    Программно настроить SSL для встроенного Jetty 9

    Можно ли использовать параллельную библиотеку задач в проекте .Net 3.5?

    Выбор данных с несколькими условиями

    Вернуться к основному виду деятельности, связанной с созданием уведомлений

    Каковы причины, по которым вы хотели бы использовать вложенные classы?

    Как исправить TypeError: Unicode-объекты должны быть закодированы перед хешированием?

    Есть ли хороший способ извлечь куски данных из streamа java 8?

    Возможно ли импортировать файл реестра Windows без разрушения системы?

    Захват квантификаторов и арифметика квантификаторов

    Давайте будем гением компьютера.