更改 Ionic 选项卡以导航到它们的根页面而不是它们的最后一页

Posted

技术标签:

【中文标题】更改 Ionic 选项卡以导航到它们的根页面而不是它们的最后一页【英文标题】:Change Ionic Tabs to navigate to their root page and not to their last page 【发布时间】:2018-01-21 12:50:42 【问题描述】:

我正在使用离子标签导航

<ion-tabs #mainTabs>
  <ion-tab [root]="tab1" tabTitle="Page1" tabIcon="icon-tasks"></ion-tab>
  <ion-tab [root]="tab2" tabTitle="Page2" tabIcon="icon-calendar"></ion-tab>
  <ion-tab [root]="tab3" tabTitle="Page3" tabIcon="icon-profile"></ion-tab>
</ion-tabs>

一切正常,除了当我点击一个选项卡时,它会转到该堆栈上最后访问的页面,而不是堆栈的根页面。

例如:

Page1
  Subpage1 (root)
  Subpage2
  Subpage3 <-- Last visited page
Page2
Page3

如果我在最后访问的页面(Subpage3)上,然后我触摸标签页 Page3,然后我触摸 Page1 的标签,它会返回到 Subpage3,但我希望它转到作为根目录的 Subpage1。

感谢您的帮助!

【问题讨论】:

这个问题和另一个类似:***.com/questions/59630946/… 【参考方案1】:

就像 Sampath cmets 一样,这是设计使然。我发现的唯一方法是通过 ion-tab 更改事件来强制它:

tabChanged($ev) 
  $ev.setRoot($ev.root);

<ion-tabs #mainTabs (ionChange)="tabChanged($event)">
  <ion-tab [root]="tab1" tabTitle="Page1" tabIcon="icon-tasks"></ion-tab>
  <ion-tab [root]="tab2" tabTitle="Page2" tabIcon="icon-calendar"></ion-tab>
  <ion-tab [root]="tab3" tabTitle="Page3" tabIcon="icon-profile"></ion-tab>
</ion-tabs>

【讨论】:

我想你忘记了事件参数 (ionChange)="clickTab($event)" 这在 Ionic 4 中不起作用。它将是 (ionTabsDidChange)="tabChanged($event),但事件是 CustomEvent&lt;tab: string&gt; 类型,没有 rootsetRoot 你把tabChanged($ev) $ev.setRoot($ev.root); 的代码放在哪里了? 有谁知道如何为 Ionic v1 应用程序执行此操作?甚至可以在v1中做吗?尝试修复使用$state.go("tabRoot") 的旧应用程序,以在单击菜单选项卡按钮时强制选项卡子视图返回父/根视图 - 它可以工作,但它很难看,因为您确实看到子视图转换回父视图看法。在用户将子视图留给另一个选项卡后,我找不到任何其他方法将选项卡返回到根视图...然后返回到相关选项卡。 这在 Ionic v5 中也不起作用,但这个答案可以:***.com/questions/59630946/…【参考方案2】:

Ionic 5 的替代方法

.html

<ion-tabs (ionTabsDidChange)="setRootTab($event)">
  <ion-tab-bar slot="bottom">
    <ion-tab-button tab="schedule">
      <ion-icon name="calendar"></ion-icon>
      <ion-label>Schedule</ion-label>
    </ion-tab-button>

    <ion-tab-button tab="speakers">
      <ion-icon name="person-circle"></ion-icon>
      <ion-label>Speakers</ion-label>
    </ion-tab-button>
 
</ion-tabs>

.ts

 setRootTab(event: any): void 
    switch (event?.tab) 
      case 'schedule':
           
          this.router.navigateByUrl('tabs/schedule');

        break;

      case 'speakers':
        this.router.navigateByUrl('tabs/speakers');

        break;

    

      default:
    
  

这是设计的

这是设计使然。换句话说,每个 ion-tab 都是 NavController 的声明性组件。因此,如果您将某些内容推送到 tab's NavController,当您回来时它仍然存在再次转到该选项卡。

NavController 是导航控制器组件的基类 像导航和标签。您使用导航控制器导航到页面 在您的应用程序中。在基本层面上,导航控制器是一个数组 代表特定历史的页面(例如选项卡)。这 可以通过推送和操作数组来导航整个应用程序 弹出页面或在任意位置插入和删除它们 历史。

请查看Doc for more info

【讨论】:

这种设计并不意味着不可能实现 OP 的要求。事实上,@Salva Bordas 的回答确实按要求工作 作为开发人员,永远小心说“不能”! :D 这种行为很奇怪!它至少应该是可配置的。 Ionic v5 仍然存在这个问题。此解决方案破解它:***.com/a/59632336/3317037 作为参考,这是处理此问题的确切 Ionic 代码行:github.com/ionic-team/ionic-framework/blob/… @daymannovaes 更改非常容易。请参阅上面的更新。 @Sampath 感谢您的更新。它有效,但不幸的是仍然是解决 Ionic 奇怪行为的一种 hacky 方式。【参考方案3】:

所以我这样做是为了修复最新的角度和离子

 <ion-tab-button (click)="appointments()" tab="appointments">

而我们ts中的约会()函数是:

appointments(): void                   
  this.router.navigate(['/customer/appointments']);

很简单,我们只是在我们需要的页面上路由,并没有打开这个奇怪的最后一页。

【讨论】:

【参考方案4】:

在每个子页面上使用 this.navCtrl.popToRoot() 函数。 你可以在这里找到更多关于它的信息。 https://ionicframework.com/docs/api/navigation/NavController/

【讨论】:

这在 Ionic 4 中不存在。 @Russ OP 指定的只有 Ionic 2Ionic 3 标签。 明白。只需为 Ionic4 中访问此页面的人员添加信息。 popToRoot 确实存在于 ionic 4 github.com/ionic-team/ionic/blob/…【参考方案5】:

试试这个:

this.navCtrl.goBack();//for ionic 4
this.navCtrl.pop(); //ionic 3

因为 pop 或 goback 会将最后访问的页面从堆栈中弹出

【讨论】:

是的,但你会看到过渡。

以上是关于更改 Ionic 选项卡以导航到它们的根页面而不是它们的最后一页的主要内容,如果未能解决你的问题,请参考以下文章

获取选定的选项卡以切换图标 Ionic 5

在 Ionic 中更改 HTML 时避免整页重新加载

Ionic 2 在页面组件而不是根组件上定义菜单

如何通过 URL 更改而不是页面重定向进行 ajax 加载?

使用锚标签链接打开标签?

从选项卡转到根页面