为什么 Angular router.navigate() 不导航?
Why is Angular router.navigate() not navigating?
我正在 angular 中构建身份验证。登录后,应重定向用户。我的问题是 router.navigate() 函数似乎不起作用...
这是不起作用的代码:
async login() {
if(!this.email || !this.password) {
return;
}
this.showSpinner = true;
this.authService.login(this.email, this.password).then(
(data) => {
this.router.navigate(['/chore/show']);
console.log(this.router);
},
(error) => {
this.error = error.message;
this.showSpinner = false;
}
);
}
console.log 会在登录成功时显示,但不会导航到 chore/show 路由。
应用程序路由:
const routes: Routes = [
{ path: '', redirectTo: 'auth', pathMatch: 'full' },
{ path: 'auth', loadChildren: './modules/auth/auth.module#AuthModule' },
{ path: 'chore', loadChildren:
'./modules/chore/chore.module#ChoreModule', canActivate: [AuthGuard] }
];
auth 模块路由:
const routes: Routes = [
{ path: 'login', component: LoginComponent },
{ path: 'register', component: RegisterComponent},
{ path: '', redirectTo: 'login', pathMatch: "full"}
];
和杂务模块路由:
const routes: Routes = [
{ path: 'show', component: ShowChoreComponent},
{ path: '', redirectTo: 'show', pathMatch: 'full' },
];
出于某种原因,我无法在登录后将其重定向。有什么建议么?
编辑:添加了应用程序路由。代码在 https://github.com/tomgelmers/stack
检查 Github 上的代码,我会说问题是导航被您的 AuthGuard 阻止了。
AuthGuard 正在调用您的 authService 的 isLoggedIn 函数,该函数检查本地存储中的用户数据,而 authState 订阅者仍在写入本地存储。
这种东西可以工作也可以不工作,这完全取决于运气和本地存储 api 工作的速度。
我建议您在 isLoggedIn 函数中检查 AuthService 的变量用户而不是 localstorage。如果用户变量未定义,您可以检查 localstorage。
那应该相对节省,但是我不知道登录功能 returning 和 authState 订阅者触发之间的时间安排。您可能希望在登录函数中设置用户变量。 signInWithEmailAndPassword
函数执行 return 一个 Promise with Credentials,上面有一个用户 属性。
您可以将登录功能更改为
async login(email: string, password: string) {
return this.afAuth.signInWithEmailAndPassword(email, password).then(userData => {
this.user = userData.user
return userData
}
}
并将 isLoggedIn 函数设为
get isLoggedIn(): boolean {
if(this.user) return !!this.user
const user = JSON.parse(localStorage.getItem('user'));
return user !== null;
}
哦,为了完成,您可能应该在注销函数中将用户变量设置为未定义或 null。即使用户注销,用户数据仍然在内存中徘徊
我正在 angular 中构建身份验证。登录后,应重定向用户。我的问题是 router.navigate() 函数似乎不起作用... 这是不起作用的代码:
async login() {
if(!this.email || !this.password) {
return;
}
this.showSpinner = true;
this.authService.login(this.email, this.password).then(
(data) => {
this.router.navigate(['/chore/show']);
console.log(this.router);
},
(error) => {
this.error = error.message;
this.showSpinner = false;
}
);
}
console.log 会在登录成功时显示,但不会导航到 chore/show 路由。
应用程序路由:
const routes: Routes = [
{ path: '', redirectTo: 'auth', pathMatch: 'full' },
{ path: 'auth', loadChildren: './modules/auth/auth.module#AuthModule' },
{ path: 'chore', loadChildren:
'./modules/chore/chore.module#ChoreModule', canActivate: [AuthGuard] }
];
auth 模块路由:
const routes: Routes = [
{ path: 'login', component: LoginComponent },
{ path: 'register', component: RegisterComponent},
{ path: '', redirectTo: 'login', pathMatch: "full"}
];
和杂务模块路由:
const routes: Routes = [
{ path: 'show', component: ShowChoreComponent},
{ path: '', redirectTo: 'show', pathMatch: 'full' },
];
出于某种原因,我无法在登录后将其重定向。有什么建议么? 编辑:添加了应用程序路由。代码在 https://github.com/tomgelmers/stack
检查 Github 上的代码,我会说问题是导航被您的 AuthGuard 阻止了。
AuthGuard 正在调用您的 authService 的 isLoggedIn 函数,该函数检查本地存储中的用户数据,而 authState 订阅者仍在写入本地存储。
这种东西可以工作也可以不工作,这完全取决于运气和本地存储 api 工作的速度。
我建议您在 isLoggedIn 函数中检查 AuthService 的变量用户而不是 localstorage。如果用户变量未定义,您可以检查 localstorage。
那应该相对节省,但是我不知道登录功能 returning 和 authState 订阅者触发之间的时间安排。您可能希望在登录函数中设置用户变量。 signInWithEmailAndPassword
函数执行 return 一个 Promise with Credentials,上面有一个用户 属性。
您可以将登录功能更改为
async login(email: string, password: string) {
return this.afAuth.signInWithEmailAndPassword(email, password).then(userData => {
this.user = userData.user
return userData
}
}
并将 isLoggedIn 函数设为
get isLoggedIn(): boolean {
if(this.user) return !!this.user
const user = JSON.parse(localStorage.getItem('user'));
return user !== null;
}
哦,为了完成,您可能应该在注销函数中将用户变量设置为未定义或 null。即使用户注销,用户数据仍然在内存中徘徊