Dai*_*imz 9 javascript angularjs angular-ui-router
我正在使用AngularJs和Ui-Router,我正在尝试设置两个不同的主页,一个用于登录的用户,另一个用于非用户.但是我收到以下错误:
RangeError: Maximum call stack size exceeded
Run Code Online (Sandbox Code Playgroud)
我跑了console.trace(),我可以看到有一个问题导致状态无限循环(或类似的东西).BUt我不知道如何解决它.
这是生成错误的代码.
.run(function ($rootScope, $state, $location, Auth) {
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState) {
if(fromState.name === "") {
if (Auth.isLoggedIn()) {
$state.go('main');
event.preventDefault();
} else {
$state.go('welcome');
event.preventDefault();
}
} else {
if (toState.authenticate && !Auth.isLoggedIn()) {
$location.path('/login');
event.preventDefault();
}
}
});
Run Code Online (Sandbox Code Playgroud)
从我所知道的,它似乎源于 if(fromState.name === "")
Rad*_*ler 10
我创建了一个示例,使用默认页面和auth/unauth用户.在这里可以看到类似的问题
首先,这将是听众:
app.run(function ($rootScope, $state, $location, Auth) {
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState) {
var shouldLogin = toState.data !== undefined
&& toState.data.requireLogin
&& !Auth.isLoggedIn ;
// NOT authenticated - wants any private stuff
if(shouldLogin)
{
$state.go('login');
event.preventDefault();
return;
}
// authenticated (previously) comming not to root main
if(Auth.isLoggedIn)
{
var shouldGoToMain = fromState.name === ""
&& toState.name !== "main" ;
if (shouldGoToMain)
{
$state.go('main');
event.preventDefault();
}
return;
}
// UNauthenticated (previously) comming not to root public
var shouldGoToPublic = fromState.name === ""
&& toState.name !== "public"
&& toState.name !== "login" ;
if(shouldGoToPublic)
{
$state.go('public');console.log('p')
event.preventDefault();
}
// unmanaged
});
});
Run Code Online (Sandbox Code Playgroud)
怎么了?
以下是各州:
$stateProvider
// available for anybody
.state('public',{
url : '/public',
template : '<div>public</div>',
})
// just for authenticated
.state('main',{
url : '/main',
template : '<div>main for authenticated</div>',
data : {requireLogin : true },
})
// just for authenticated
.state('other',{
url : '/other',
template : '<div>other for authenticated</div>',
data : {requireLogin : true },
})
// the log-on screen
.state('login',{
url : '/login',
templateUrl : 'tpl.login.html',
controller : 'LoginCtrl',
})
Run Code Online (Sandbox Code Playgroud)
小智 6
使用$ state.go("main",{},{notify:false}); 不通知"$ stateChangeStart"事件.
// NOT authenticated - wants any private stuff
if(shouldLogin)
{
$state.go("main", {}, {notify:false});
event.preventDefault();
return;
}
// authenticated (previously) comming not to root main
if(Auth.isLoggedIn)
{
var shouldGoToMain = fromState.name === ""
&& toState.name !== "main" ;
if (shouldGoToMain)
{
$state.go("main", {}, {notify:false});
event.preventDefault();
}
return;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27827 次 |
| 最近记录: |