Aurelia 设置参数化路由页面的多个实例的标题

Aurelia 设置参数化路由页面的多个实例的标题,aurelia,Aurelia,我将路由配置定义为: { route: 'page/:id', name: 'page', moduleId: 'page', title: "Page #" } 我还有另一个组件在监听路由器:导航:完成事件(EventAggregator),当发现一个不同的片段时,它会将其添加到一个数组中,并使用NavigationInstruction.config.navModel.title将其显示在屏幕上(作为一种历史列表) 当我使用不同的ID时间导航到“页面”组件时,例如/page/1,/page

我将路由配置定义为:

{ route: 'page/:id', name: 'page', moduleId: 'page', title: "Page #" }
我还有另一个组件在监听
路由器:导航:完成
事件(EventAggregator),当发现一个不同的片段时,它会将其添加到一个数组中,并使用
NavigationInstruction.config.navModel.title将其显示在屏幕上(作为一种历史列表)

当我使用不同的ID时间导航到“页面”组件时,例如
/page/1
/page/2
/page/3
。我从
activate()
方法调用
NavigationInstruction.config.navModel.setTitle(“Page”+id)

在我的历史中,我最初会看到:

"Page 1"`
。。。然后在导航到
#/page/2

"Page 2"
"Page 2"
"Page 3"
"Page 3"
"Page 3"
。。。然后在导航到
#/page/3

"Page 2"
"Page 2"
"Page 3"
"Page 3"
"Page 3"
由于不同的
导航指令之间共享
RouteConfig
,因此更改
navModel.title
值会影响从该
RouteConfig
派生的所有
导航指令

有人知道如何为页面组件的每个实例设置自定义标题吗?Aurelia是否可以处理同一组件的多个同时实例


我已经考虑过使用新的
路由器.transformTitle
挂钩,但由于我可能最终会在标题中包含更多信息,例如
“第1页:内容”
“第2页:第一章”
,这感觉不太理想,可能会让我花很多时间滚动我自己的架构来动态解析字符串。

我创建了一个非常简单的应用程序来测试这一点。不过,我确实使用了一种稍微不同的策略。我使用了
页面上的
activate
回调,而不是订阅
router:navigation:complete
事件。 这是我的密码:

export class Page {
  activate(params, route, instruction) {
    this.pageNumber = parseInt( params.id || '1' );
    instruction.config.navModel.setTitle("Page " + this.pageNumber)
  }
}
我没有看到你看到的行为:


您使用的是什么版本的框架模块?

从代码和响应来看(感谢@Ashley Grant),我对
导航指令的期望似乎并不准确

A
NavigationInstruction
表示触发、导航、停用以前的页面、激活新页面以及触发作为该过程一部分触发的任何事件的单个工作流。

正如我所想,它并不表示RouteConfig的“实例”(即片段,加上参数)。因此,在触发
navigation:router:complete
事件后引用
NavigationInstruction
,是不可取的,因此不起作用


现在,我将重写代码,以便在触发
导航:路由器:complete
事件时复制标题(这实际上不是小事,需要调用指令上的
\u buildTitle()
私有方法)-并提出了一个FR-,以请求减少此操作的不透明性。

是否可能您在不同的虚拟机中订阅了事件聚合器,但在离开它们时忘记取消订阅?否,我订阅路由器:导航:完成的虚拟机在应用程序的生命周期内保持不变。所以这不是一个多调用问题,只是路由器从一个RouteConfig对象获取标题,该对象在针对它生成的所有导航指令之间共享。不确定这是在测试相同的场景。在这种情况下,一次只有一个导航指令,每次访问历史记录中的任何页面时只需更新NavModel(在调用.setTitle之前,它将设置为您导航到的上一页面中设置的值)。不过,您可能已经暗示了一种解决方案。我可能需要通过只存储或更新导航标题:router:complete来解决这个问题,而不是直接引用NavigationInstruction-这似乎只是为了有一个链接到特定导航操作的生命周期,而不是讨论中的片段。我不确定我是否在关注你。示例不同。在您的场景中,标题位于浏览器的历史记录中,而不在SPA上下文中,因此对setTitle的调用不会修改这些内容。当您导航回某个页面时,您在activate中调用setTitle,因此它会在那里重置,然后重新启动。我的例子中有多个导航指令被持久化,我开始意识到这可能不是该类的预期用途:导航指令预计在导航:路由器之后将基本上超出范围;complete fires,它不应该是(正如我所使用的)对.fragment plus.params的引用。是的,该指令只是表示:这是路由器试图遵循的指令。“导航到这条路线”正是我要找的。。。但在我的例子中,应用程序组件的构造函数调用一个私有函数来设置“DeepTitle”,它基本上是在页面标题之后附加组织的名称。但是现在我增加了从我的组件到应用程序组件的通信开销,以设置最终标题。不过,感谢@Rick Barber对导航说明的详细解释。非常感谢!!!