从状态提供程序的解析方法更改角度应用程序的状态
Change state of angular app from resolve method of state provider
我在我的角度应用程序中使用了ui-router。目前我有两条路线/signin和/user。最初,当用户单击登录按钮时,它会显示/signin,我正在发送 ajax 请求并获取用户 ID。我将用户 ID 存储在本地存储中并将状态更改为/user。
现在,我想要的是,如果用户未登录,并且用户将地址栏更改为/user,它不会更改视图,而是会再次将地址栏 url 更改为/signin。
我尝试使用解析,但它不起作用。我的代码是:-
module.exports = function($stateProvider, $injector) {
$stateProvider
.state('signin', {
url: '/signin',
template: require('../templates/signin.html'),
controller: 'LoginController'
})
.state('user', {
url: '/user/:id',
template: require('../templates/user.html'),
resolve:{
checkLogin: function(){
var $state = $injector.get('$state');
console.log("in resolve");
if (! window.localStorage.getItem('user-id')) {
console.log("in if")
$state.go('signin');
}
}
},
controller: 'UserController'
})
}
请帮我解决这个问题。
我认为不允许在状态转换过程中更改状态。
因此,解决它的方法是将 checkLogin
resolve 参数(我在下面将其更改为 userId
(作为一个返回值或承诺的函数(在这种情况下,如果您无法获得 user-id
,则为被拒绝的承诺(。
然后,您需要在$rootScope.$on('$stateChangeError')
中处理此问题并检查错误代码。
resolve: {
userId: function ($q, $window) {
var userId = $window.localStorage.getItem('user-id');
if (!userId) {
return $q.reject("signin")
}
return userId;
}
}
并在$stateChangeError
处理程序中重定向:
$rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
if (error === "signin") {
$state.go("signin");
}
});
如果有人遇到此问题,您可以使用超时服务来解决它。它将状态切换调用放在队列的末尾。
此外,您应该使用承诺。拒绝它将阻止该状态的初始化:
resolve:{
checkLogin: function(){
var deferred = $q.defer();
var $state = $injector.get('$state');
if (!window.localStorage.getItem('user-id')) {
$timeout(function(){$state.go('signin');});
deferred.reject();
} else {
deferred.resolve();
}
return deferred.promise;
}
},
相关文章:
- 在mvc应用程序中,在回发时保留最初隐藏的文本框的隐藏或可见状态
- Web应用程序,将成员状态更新为其他成员
- 在通知点击时使用Ion中的OneSignal插件路由到应用程序中的状态
- 使用应用程序状态js和视图在angular js url上传递两个参数
- 来自应用程序状态的Jquery数据表源
- 检测Ionic中特定的应用程序状态变化
- 在基于Strophe.js的聊天应用程序中处理状态
- 如何保持JavaScript web应用程序的状态
- 在angular js中,每次应用程序进入状态时,重新加载状态的最佳方式是什么
- 在用于SEO的Marionette应用程序中使用推送状态
- 使用AsyncStorage实例化持久应用程序状态
- 如何在React应用程序中处理权限检查(Redux中的状态维护)
- 如何在类似Om的不可变应用程序状态下对关系数据进行建模
- 我如何才能进入一个完整的角度状态应用程序
- Chrome应用程序:无法检索文件加载状态
- Sencha Touch和Cordova应用程序在设备上运行时卡在启动状态
- 在应用程序加载和 angularjs 中的每个状态更改时调用 jquery 插件
- 安卓 - 加载应用程序时检查切换按钮的状态
- Web 应用程序需要记住对象状态 - 需要解决方案建议
- Ember 应用程序就绪状态 - 应用程序无法识别方法