【发布时间】:2019-08-11 02:13:53
【问题描述】:
我在标签页上有一个按钮,可以通过删除存储条目为用户重置应用:
export class Tab1Page {
constructor(private router: Router, private storage: Storage, private toastController: ToastController) { }
async resetSettings() {
await this.storage.remove('welcomeComplete');
const toast = await this.toastController.create({
message: 'Your settings have been reset.',
duration: 2000
});
await toast.present();
console.log('before');
this.router.navigateByUrl('/');
console.log('after');
}
}
在浏览器调试器中,我可以看到该条目正在从存储中删除。我也收到了烤面包。
但是,由于某种原因,navigateByUrl 方法似乎没有被触发。 上述页面位于 url '/tabs/tab1'。两个 console.log() 语句都执行了,控制台没有错误。
我是前端开发的新手,如果这是一个基本的新手问题,请道歉。
更新
我的 app-routing.module.ts
import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
import { WelcomeGuard } from './welcome/welcome.guard';
const routes: Routes = [
{
path: '',
loadChildren: './tabs/tabs.module#TabsPageModule',
canActivate: [WelcomeGuard]
},
{
path: 'welcome',
loadChildren: './welcome/welcome.module#WelcomePageModule',
}
];
@NgModule({
imports: [
RouterModule.forRoot(routes, { enableTracing: true, preloadingStrategy: PreloadAllModules })
],
exports: [RouterModule]
})
export class AppRoutingModule {}
我的welcome.guard.ts
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router, CanActivate } from '@angular/router';
import { Observable } from 'rxjs';
import { Storage } from '@ionic/storage';
@Injectable({
providedIn: 'root'
})
export class WelcomeGuard implements CanActivate {
constructor(private router: Router, private storage: Storage) {}
async canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Promise<boolean> {
const welcomeComplete = await this.storage.get('welcomeComplete');
if (!welcomeComplete) {
this.router.navigateByUrl('/welcome');
}
return true;
}
}
我已将我的 resetSettings() 更改为以下内容:
async resetSettings() {
await this.storage.remove('welcomeComplete');
const toast = await this.toastController.create({
message: 'Your settings have been reset.',
duration: 2000
});
toast.onDidDismiss().then(() => {
this.router.navigateByUrl('');
});
await toast.present();
}
更改 resetSettings() 并没有解决问题。
【问题讨论】:
-
您可以尝试将
this.router.navigateByUrl('/');包装在setTimeout()中吗?像这样:setTimeout(() => { this.router.navigateByUrl('/'); }, 0); -
谢谢,但这也没用。
-
我认为问题存在于您的代码示例之外。也许与路由器配置有关。
navigateByUrl返回一个promise,成功时解析为true,失败时解析为false。你知道这个承诺是否正在解决吗?如果它没有解决,那么您可能希望让路由器变得健谈,这样您就可以看到正在发生的事情。这可以在应用路由器中通过将enableTracing设置为true- angular.io/api/router/RouterModule#forroot 来完成 -
相关页面是否有 canActivated / canDeactivate 守卫?
-
你能创建一个显示问题的堆栈闪电战吗?