Nic*_*oan 35 angularjs angular-ui-router
我正在写一个处理程序$stateChangeStart:
var stateChangeStartHandler = function(e, toState, toParams, fromState, fromParams) {
if (toState.includes('internal') && !$cookies.MySession) {
e.preventDefault();
// Some login stuff.
}
};
$rootScope.$on('$stateChangeStart', stateChangeStartHandler);
Run Code Online (Sandbox Code Playgroud)
toState没有包含方法.我应该做些不同的事情,还是有办法做我想做的事情?
此外,当//某些登录内容包含a时$state.go(...),我会得到一个无限循环.可能导致什么?
这是一个更完整的例子,展示了我们最终的工作:
angular.module('test', ['ui.router', 'ngCookies'])
.config(['$stateProvider', '$cookiesProvider', function($stateProvider, $cookiesProvider) {
$stateProvider
.state('public', {
abstract: true
})
.state('public.login', {
url: '/login'
})
.state('tool', {
abstract: true
})
.state('tool.suggestions', {
url: '/suggestions'
});
}])
.run(['$state', '$cookies', '$rootScope', function($state, $cookies, $rootScope) {
$rootScope.$on('$stateChangeStart', function(e, toState, toParams, fromState, fromParams) {
if (toState.name.indexOf('tool') > -1 && !$cookies.Session) {
// If logged out and transitioning to a logged in page:
e.preventDefault();
$state.go('public.login');
} else if (toState.name.indexOf('public') > -1 && $cookies.Session) {
// If logged in and transitioning to a logged out page:
e.preventDefault();
$state.go('tool.suggestions');
};
});
});
Run Code Online (Sandbox Code Playgroud)
我不喜欢indexOf用来搜索特定的状态toState.感觉很幼稚.我不知道为什么toState,并fromState不能成为的一个实例$state的服务,或者为什么$state服务不能接受它的方法的状态配置覆盖.
无限循环是由我们的错误引起的.我不喜欢这个,所以我仍然在寻找更好的答案.
小智 70
将对象添加到$stateProvider.state该对象时,将随状态一起传递.因此,您可以添加其他属性,以便稍后在需要时阅读.
示例路由配置
$stateProvider
.state('public', {
abstract: true,
module: 'public'
})
.state('public.login', {
url: '/login',
module: 'public'
})
.state('tool', {
abstract: true,
module: 'private'
})
.state('tool.suggestions', {
url: '/suggestions',
module: 'private'
});
Run Code Online (Sandbox Code Playgroud)
该$stateChangeStart事件使您可以访问toState和fromState对象.这些状态对象将包含配置属性.
示例检查自定义模块属性
$rootScope.$on('$stateChangeStart', function(e, toState, toParams, fromState, fromParams) {
if (toState.module === 'private' && !$cookies.Session) {
// If logged out and transitioning to a logged in page:
e.preventDefault();
$state.go('public.login');
} else if (toState.module === 'public' && $cookies.Session) {
// If logged in and transitioning to a logged out page:
e.preventDefault();
$state.go('tool.suggestions');
};
});
Run Code Online (Sandbox Code Playgroud)
我没有改变cookie的逻辑,因为我认为这超出了你的问题的范围.
您可以创建一个帮助程序,以使您的工作更加模块化.
值 publicStates
myApp.value('publicStates', function(){
return {
module: 'public',
routes: [{
name: 'login',
config: {
url: '/login'
}
}]
};
});
Run Code Online (Sandbox Code Playgroud)
值 privateStates
myApp.value('privateStates', function(){
return {
module: 'private',
routes: [{
name: 'suggestions',
config: {
url: '/suggestions'
}
}]
};
});
Run Code Online (Sandbox Code Playgroud)
帮手
myApp.provider('stateshelperConfig', function () {
this.config = {
// These are the properties we need to set
// $stateProvider: undefined
process: function (stateConfigs){
var module = stateConfigs.module;
$stateProvider = this.$stateProvider;
$stateProvider.state(module, {
abstract: true,
module: module
});
angular.forEach(stateConfigs, function (route){
route.config.module = module;
$stateProvider.state(module + route.name, route.config);
});
}
};
this.$get = function () {
return {
config: this.config
};
};
});
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用帮助程序将状态配置添加到状态配置中.
myApp.config(['$stateProvider', '$urlRouterProvider',
'stateshelperConfigProvider', 'publicStates', 'privateStates',
function ($stateProvider, $urlRouterProvider, helper, publicStates, privateStates) {
helper.config.$stateProvider = $stateProvider;
helper.process(publicStates);
helper.process(privateStates);
}]);
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以抽象出重复的代码,并提出更加模块化的解决方案.
注意:上面的代码未经过测试
| 归档时间: |
|
| 查看次数: |
98378 次 |
| 最近记录: |