一尘不染

离子历史记录如何工作以及何时创建非根堆栈?

angularjs

我使用的离子 V1.0.0和不理解所管理的并行方式的历史$ionicHistory著作。

特别是在Android设备上,当使用(以前为硬件)后退按钮时,我的Angular应用有时会表现得很奇怪,我想了解原因。(示例:向后导航可打开$ionicGoBack()很久以前关闭的视图)

对我来说,似乎某些ui路由器导航会创建新的历史记录堆栈,而其他一些则将历史记录项放在根历史记录中,即使从状态到子状态的访问都应附加到记录了IMO的历史记录中。

问题

  • 任何人都可以解释在哪种情况下ui-sref$state.go(...)将历史记录项添加到新创建的堆栈中吗?
  • 什么时候附加到root
  • 是否以特殊方式对待情态?

抱歉,没有具体说明,但是该应用程序相当复杂,我不知道如何在单个插件中隔离问题。也许我错过了一些很好的文档…


阅读 206

收藏
2020-07-04

共1个答案

一尘不染

即使您可能找不到要查询的所有信息,我也会尝试回答这个问题。

很多人-包括我自己-似乎很难理解导航系统和历史的工作方式。

前面我已经回答了一个问题,试图解释为什么事情没有按预期进行。导航似乎可以跟踪用户使用集合访问过的每个视图。实际上,$ionicHistory对象中有2个集合。第一个$ionicHistory.viewHistory().views似乎跟踪当前堆栈中每个已访问的视图,而另一个$ionicHistory.viewHistory().histories跟踪整个应用程序的所有历史记录。

选项卡,菜单或常规视图的历史记录类型可能不同。

您可以在此Codepen中看到并行的独立历史记录如何工作。
那里有2种不同的历史。一个用于主页选项卡,第二个用于关于选项卡。

浏览每个选项卡中的子项并返回上一个选项卡,您会注意到导航系统已记住了先前的状态。

我在这里准备了另一个插件,您可以在其中查看导航的工作方式以及页面中显示的一些详细信息。

$ionicHistory.viewHistory().views每次用户访问新页面时,视图的集合都会更新(集合中的当前视图用方括号括起来)。

如果视图已添加到集合中,则不会(不应)再次添加。

您可以清除历史记录($ionicHistory.clearHistory())或设置当前历史记录的根目录来更改行为:

$ionicHistory.nextViewOptions({
    historyRoot: true
});

在我的小矮人的“发票”页面上,有一个绿色按钮(“其他”根视图)。当按下时,我设置新的历史记录根并更改状态:

$ionicHistory.nextViewOptions({
    historyRoot: true
});
$state.go('otherviewroot');

事情按预期工作,实际上我现在没有后视图,并且堆栈仅包含当前视图。

当您尝试序列时,事情变得混乱了:

Home - Contacts - Invoices - Home (button in the header).

现在看来,Ionic已失去对序列的控制,并继续向集合中添加视图。

按下主页按钮应清除后退按钮,因为我们位于当前历史记录的根目录下,但不会发生。

一遍又一遍地使用相同的模式会无限期地增加集合的大小。

我猜这不是正确的行为,需要修复。

回到您的问题。

Android中的“后退”按钮可以正常工作…表示它遵循相同的模式。

幸运的是,模态不被视为常规视图,并且不会影响集合。

2020-07-04