AngularJs UI-Router - Обновление страницы $state.current теперь пусто

У меня есть приложение Angular, использующее ui-router, и у меня возникают проблемы всякий раз, когда я обновляю страницу. Я использую вложенные представления, именованные представления для создания приложения. Всякий раз, когда я обновляю страницу, ui-router не перезагружает текущее состояние и просто оставляет страницу пустой.

При загрузке страницы $state.current равно

Object {name: "", url: "^", views: null, abstract: true}

Я читаю свою навигацию из файла .json через $http и перебираю состояния. Итак, что я могу показать:

stateProvider.state(navElement.stateName, {
    url: navElement.regexUrl ? navElement.regexUrl : url,
    searchPage: navElement.searchPage,   //something custom i added
    parent: navElement.parent ? navElement.parent : "",
    redirectTo: navElement.redirectTo,
    views: {
        'subNav@index': {
            templateUrl: defaults.secondaryNavigation,
            controller: 'secondaryNavigationController as ctrl' //static
        },
        'pageContent@index': {
            template: navElement.templateUrl == null 
                                              ? '<div class="emptyContent"></div>' 
                                              : undefined,
            templateUrl: navElement.templateUrl == null 
                                              ? undefined 
                                              : navElement.templateUrl,
            controller: navElement.controller == null 
                                              ? undefined 
                                              : navElement.controller + ' as ctrl'
        }
    }
});

Этот код выполняется для каждого элемента вложенного объекта json. Если есть что-то еще, что было бы полезно, дайте мне знать.


person gwin003    schedule 29.04.2015    source источник


Ответы (2)


Есть вопрос: AngularJS - UI-router - Как настроить динамические представления с одним ответом, который показывает, как это сделать .

Что случилось? При обновлении url оценивается раньше, чем регистрируются состояния. Мы должны отложить это. И решение основано на UI-Router встроенной функции deferIntercept(defer)

$urlRouterProvider.deferIntercept(defer)

Как указано в документе:

Отключает (или включает) отложенный перехват изменения местоположения.

Если вы хотите настроить поведение синхронизации URL-адреса (например, если вы хотите отложить переход, но сохранить текущий URL-адрес), вызовите этот метод во время настройки. Затем во время выполнения вызовите $urlRouter.listen() после настройки собственного обработчика событий $locationChangeSuccess.

В двух словах, мы остановим обработку URL-адресов на этапе настройки:

app.config(function ($urlRouterProvider) {
 
  // Prevent $urlRouter from automatically intercepting URL changes;
  // this allows you to configure custom behavior in between
  // location changes and route synchronization:
  $urlRouterProvider.deferIntercept();
 
})

И мы снова включим это на этапе .run(), как только мы настроим все динамические состояния из JSON:

.run(function ($rootScope, $urlRouter, UserService) {
 
  ...

    // Once the user has logged in, sync the current URL
    // to the router:
     $urlRouter.sync();
 
    // Configures $urlRouter's listener *after* your custom listener
    $urlRouter.listen();
});

Существует plunker из связанного Вопросы и ответы

person Radim Köhler    schedule 29.04.2015
comment
Просто ПРИМЕЧАНИЕ. Я ожидал этого утверждения в вопросе .. Я читаю свою навигацию из файла json... означает, что вы делаете это из загруженного .json, загруженного через $http. Если нет, то мой ответ не поможет... - person Radim Köhler; 29.04.2015
comment
Я загружаю файл json через $http, вызывая службу WebApi, поэтому ваш ответ по-прежнему актуален. Хотя я добавил deferIntercept() в свою конфигурацию и sync() и listen() в свой метод запуска, я все еще сталкиваюсь с той же проблемой. - person gwin003; 29.04.2015
comment
Я использую то же самое в реальной жизни. 1:1. Я бы предложил исследовать мой плункер, и это должно помочь (плюс подробности в связанных вопросах и ответах). Или настройте мой плункер и покажите мне, что не работает... Потому что с фрагментом в вашем вопросе это почти максимум, который я могу показать, я могу предложить... Имеет ли это смысл? - person Radim Köhler; 29.04.2015
comment
Единственная разница заключается в том, что ваши URL-адреса содержат ^, а мои — нет. Может ли это быть виновником? - person gwin003; 29.04.2015
comment
Это просто сброс URL-адреса. Без него - дети наследуют первую часть от родителя. С этим знаком URL-адрес детей начинается с самого начала. Так что я бы сомневался, что это проблема... - person Radim Köhler; 29.04.2015
comment
Сейчас отлаживаю исходники ui-router, отчитаюсь. Кажется, что функция check() внутри функции update() не обрабатывает URL-адреса всякий раз, когда проверяются правила. Возможно, мои URL-адреса не настроены должным образом в моих штатах. Мои URL настроены следующим образом: pastebin.com/ZHepheCX - person gwin003; 29.04.2015
comment
Теперь я смог получить свое решение в значительной степени. Это была проблема из двух частей, добавление deferIntercept(), sync() и listen() решило одну часть проблемы. Я также видел проблемы, если мой URL имел косую черту в конце, поэтому добавление $urlMatcherFactoryProvider.strictMode(false) решило эту проблему. Спасибо, что снова спас меня, @RadimKohler! - person gwin003; 30.04.2015
comment
@RadimKöhler это решает мою проблему при обновлении дочерних состояний. но если я попытаюсь получить доступ только к базовому индексу '/'. Я получаю бесконечное обновление автоматически. - person LogronJ; 05.09.2018
comment
у меня есть $urlRouterProvider.otherwise('/'); он должен перейти в определенное состояние. - person LogronJ; 05.09.2018

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

person manzapanza    schedule 29.04.2015