Мне нужно запретить пользователям переходить в определенные состояния (панель и учетная запись) в приложение, если они не выполнили все необходимые шаги регистрации. Если пользователь пытается получить доступ к этим состояниям путем прямого ввода 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-адрес непосредственно в браузере?
Вы очень близки. Все, что вам не хватало:
$rootScope.$on("$stateChangeSuccess", (event, toState, toParams, fromState, fromParams) => {
let shouldPreventNavigationToAccountPages = fromState.name.includes('enroll') && toState.parent === 'layout';
if (shouldPreventNavigationToAccountPages) {
//This
event.preventDefault();
redirectUser();
}
}
Мне нужно запретить пользователям переходить в определенные состояния (панель и учетная запись) в приложение, если они не выполнили все необходимые шаги регистрации.
Запретить пользователям переходить в состояние, отклоняя решение.
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
$state.go('error')
и затем вернуть $q.reject()
в своем операторе else
let shouldPreventNavigationToAccountPages = (!fromState.name || fromState.name.includes('enroll')) && toState.parent === 'layout';
?