UI-Router не получает предыдущее состояние на $ stateChangeSuccess

0

Мне нужно запретить пользователям переходить в определенные состояния (панель и учетная запись) в приложение, если они не выполнили все необходимые шаги регистрации. Если пользователь пытается получить доступ к этим состояниям путем прямого ввода URL-адресов, я перенаправляю их обратно туда, где они есть. Я делаю эту простую проверку в моем блоке run чтобы перенаправить пользователя условно:

$rootScope.$on("$stateChangeSuccess", (event, toState, toParams, fromState, fromParams) => { 
    let shouldPreventNavigationToAccountPages = fromState.name.includes('enroll') && toState.parent === 'layout';

    if (shouldPreventNavigationToAccountPages) {
      redirectUser();
    }
} 

Поэтому, если пользователь приходит из состояния "регистрации" (скажем, "enroll.step-one") и пытается получить доступ к состоянию "макета", ему не разрешено, они должны быть перенаправлены. Однако, когда я ввожу URL-адрес напрямую (без клика по ссылке), "fromState" возвращает следующий объект:

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

У меня нет доступа к предыдущему состоянию и вы не можете выполнить проверку fromState.name.includes('enroll'). Это поведение по умолчанию в UI-Router? Есть ли способ получить предыдущее состояние, если пользователь пытается получить доступ к странице, указав URL-адрес непосредственно в браузере?

  • 0
    не могли бы вы просто использовать let shouldPreventNavigationToAccountPages = (!fromState.name || fromState.name.includes('enroll')) && toState.parent === 'layout'; ?
  • 2
    если пользователь получает доступ к состоянию, вводя URL-адрес в браузере, то приложение загружается с нуля, и предыдущее состояние отсутствует.
Показать ещё 2 комментария
Теги:
angular-ui-router

2 ответа

0

Вы очень близки. Все, что вам не хватало:

$rootScope.$on("$stateChangeSuccess", (event, toState, toParams, fromState, fromParams) => { 
    let shouldPreventNavigationToAccountPages = fromState.name.includes('enroll') && toState.parent === 'layout';
    if (shouldPreventNavigationToAccountPages) {
      //This
      event.preventDefault();
      redirectUser();
    }
} 
0

Мне нужно запретить пользователям переходить в определенные состояния (панель и учетная запись) в приложение, если они не выполнили все необходимые шаги регистрации.

Запретить пользователям переходить в состояние, отклоняя решение.

myApp.config(function($stateProvider, $urlRouterProvider) {

  $stateProvider
    .state('dashboard', {
      url: "/dashboard",
      resolve: { 
          enrolled: function(enrollmentStatus) {
              if (enrollmentStatus.enrolled) {
                  return "enrolled";
              } else {
                  //throw to reject resolve
                  throw "not enrolled";
              };
          }
      },
      templateUrl: "partials/dashboard.html"
    })

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


ОБНОВИТЬ

$stateChangeError может использоваться для обработки отклонения.

$rootScope.$on("$stateChangeError", function(event, toState, toParams, fromState, fromParams, error) {
  if (error && fromState.name=='') {
    $state.go("enroll");
  }
});

Для получения дополнительной информации см. Ссылку API API интерфейса UI Router - $ stateChangeError

  • 0
    Если пользователь не зарегистрирован, у него не будет указания, что пошло не так (пустая страница). Вы можете выполнить $state.go('error') и затем вернуть $q.reject() в своем операторе else
  • 0
    @MuliYulzary Смотрите обновление об использовании события $ stateChangeError
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню