如果用户尚未完成所有必需的注册步骤,我需要阻止用户访问应用上的某些状态(信息中心和帐户)。如果用户尝试通过直接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 :(得分: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");
}
});
有关详细信息,请参阅UI Router $state API Reference -- $stateChangeError
答案 1 :(得分:0)
你非常接近。你所缺少的是:
$rootScope.$on("$stateChangeSuccess", (event, toState, toParams, fromState, fromParams) => {
let shouldPreventNavigationToAccountPages = fromState.name.includes('enroll') && toState.parent === 'layout';
if (shouldPreventNavigationToAccountPages) {
//This
event.preventDefault();
redirectUser();
}
}