【问题标题】:Ionic 4 routing with angular 6带角度 6 的 Ionic 4 路由
【发布时间】:2020-06-29 01:50:50
【问题描述】:

我目前正在尝试将旧版 ionic 应用程序更新到 v4,但似乎找不到与此导航等效的 v4

     return this.app.getRootNav().setPages([
         {page: Profile},
         {page: SettingsPage, params: {id: userId}}
     ])

【问题讨论】:

  • 这段代码将在堆栈中设置 2 页对吗?
  • @VolodymyrBilyachat 是的,我相信这一点是能够在堆栈“下”添加页面而无需先导航到它们。
  • 我可以使用 await this.navCtrl.navigateRoot('/page1'); this.navCtrl.navigateForward('/page2', { animated: false }); 在堆栈中添加 2 个页面,但问题是我们仍然可以看到第一页立即出现。

标签: angular ionic-framework angular-routing ionic4


【解决方案1】:

您的请求的 Ionic4 和 Angular 版本是这样的:

this.router
  .navigate(["/page1"], { replaceUrl: true })
  .then(() => this.router.navigate(["/page2"]));

据我所知,逻辑就在这里。将 page1 推送到历史记录但导航到 page2,因此如果用户按下后退按钮,它将重定向到 page1。 这是stackblitz 示例。

【讨论】:

  • 感谢您的回答,但由于某种原因,我无法在 Ionic 项目中重现此问题。我在 Ionic 4 中尝试了相同的代码,中间页面(page1,或在我的示例中为 tab2)仍然被加载并显示。看我的stackblitz example 你可以清楚地看到红色显示和控制台日志。你知道为什么吗?
  • @Mageek 我像这样await Promise.all([ this.router.navigate(["/tabs/tab2"], { replaceUrl: true }), this.router.navigate(["/tabs/tab3"]) ]); 尝试过它,它导航到 tab3 而没有访问 tab2 但是这样 tab2 没有进入历史,原因可能是它在延迟加载模块。
  • 我不认为原因是延迟加载,因为即使打开 tab2 一次(应该加载它对吗?),行为是一样的。
  • @Eldar Promise.all 将不按顺序同时运行所有的 Promise。这可能不是您所期望的。只需堆叠 await 语句即可按顺序执行此操作。
【解决方案2】:

抱歉,我阅读您的问题太晚了(就在今天),但为了能够找到您问题的最佳答案,我建议您查看 Ionic 4 Routes 以找到最适合您的解决方案,因为我没有足够的是时候更深入地找到最佳解决方案了,然后我将尝试描述我认为应该如何实现它,然后您寻求最佳方法来做到这一点:

如果我得到您的问题,那么您所需要的就是受益于称为“路线”的新 Ionic 导航控制方法

当您需要指定导航堆栈的顺序以保存以下内容时 订购 Profile->SettingPage 以便设置页面位于顶部,然后您可以导航回 Profile 而不是这样做:

return this.app.getRootNav().setPages([
    {page: Profile},
    {page: SettingsPage, params: {id: userId}}
])

你可以简单地:

使用类似这样的方法将您的页面 SettingsPage 与所需参数显示为根页面(假设 SettingsPage 路由路径是“设置”):

在您的 app-routing.module.ts 中:

const routes: Routes = [
    { path: '', redirectTo: 'home', pathMatch: 'full' },
    { path: 'home', loadChildren: './pages/home/home.module#HomePageModule' },
    { path: 'profile', loadChildren: './pages/profile/profile.module#ProfilePageModule' },
    { path: 'settings/:id', loadChildren: './pages/settings/settings.module#SettingsPageModule' }
];

您应该导航到 SettingsPage 的按钮应该是这样的(注意 routerDirection="root" 会将您的页面显示为根页面,这将帮助您受益于另一个属性,即 defaultHref):

<ion-button
  expand="block"
  [routerLink]="['/settings/', userId]"
  routerDirection="root"
></ion-button>

在您的 /settings 页面导航回您的个人资料页面,您可以使用“defaultHref”属性,当堆栈中不存在任何其他内容时,该属性将定义导航堆栈中的上一页(这是有保证的,因为我们将页面设置为一个根页面)。此后退按钮应如下所示:

<ion-toolbar color="primary">
    <ion-buttons slot="start">
        <ion-back-button defaultHref="/profile"></ion-back-button>
    </ion-buttons>
    <ion-title>Profile</ion-title>
</ion-toolbar>

你可以注意到你认为它相反的方式(你首先把自己放在所需的页面,然后定义当你导航回来时应该显示的默认页面。

我不知道这是否正是您需要的,但至少我从您的问题中了解到,这就是“路线”的方式。

【讨论】:

  • 感谢您的回答。这是一种有趣的方法,但恐怕这不是我正在寻找的,因为虽然它适用于 UI 后退按钮,但它不适用于 android 后退按钮或浏览器历史后退按钮,或者用iOS“滑动返回”。
  • 现在我完全明白了你的意思,我想最好通过本机插件(电容器或 Cordova)来处理这个问题。如果我是你并坚持让它像以前一样,那么我会在一个插件中做到这一点,该插件有一个函数 setPages 获得相同的参数并执行以下操作:(Android => 构建 UI 堆栈,这很明显,iOS => 访问navigationController.viewControllers=@[profileViewController, settingsViewController]; 至于浏览器和历史,我想这也是可行的,但说实话还没有尝试过)
【解决方案3】:

如果我正确理解了您的问题,您需要创建一个路由数组并将其传递给路由器模块。我通常会创建一个单独的路由模块,如下所示:

const routes: Routes = [
    {
        path:'',
        redirectTo: 'home',
        pathMatch: 'full',
     },
     {
       path'home',
       component: HomePage
     }


     @NgModule({
       imports: [RouterModule.forRoot(routes)],
       exports: [RouterModule]
      })

我相信对于 ionic 4,您可以使用与主要 Angular 网站上列出的完全相同的路由技术:https://angular.io/tutorial/toh-pt5

【讨论】:

  • 我知道,但我的问题是关于如何将上述 setPages 移植到 angular
猜你喜欢
  • 2019-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多