在Aurelia路由器中,当用户试图导航到同一页面时,是否可能收到通知?

在Aurelia路由器中,当用户试图导航到同一页面时,是否可能收到通知?,aurelia,Aurelia,我可以订阅的中的激发事件。我的代码订阅路由器:导航:处理事件,以便每当用户单击路由时,我的导航菜单关闭 eventAggregator.subscribe('router:navigation:processing', e => menu.close()); 问题是,当用户位于他们试图导航到的页面上时,菜单保持打开状态。当他们选择当前所在的页面时,我想关闭菜单 我还想提及我的菜单链接如下: <a route-href="route:showcase" class="menu-ite

我可以订阅的中的激发事件。我的代码订阅
路由器:导航:处理
事件,以便每当用户单击路由时,我的导航菜单关闭

eventAggregator.subscribe('router:navigation:processing', e => menu.close());
问题是,当用户位于他们试图导航到的页面上时,菜单保持打开状态。当他们选择当前所在的页面时,我想关闭菜单

我还想提及我的菜单链接如下:

<a route-href="route:showcase" class="menu-item">Showcase</a>


如果可能的话,我想保留我的链接,因为我喜欢
aurelia路由器如何自动绑定
href
地址。

不,没有真正的内置机制<代码>历史浏览器
负责截取锚定标记上的点击事件,并将url片段发送给routeHandler

仅当新片段与旧片段不同时才会执行此操作(如果导航状态为“替换”);如果没有,则在路由器还未涉及之前,操作就会中止

根据您需要这项服务的频率、值得投资的时间等,您会想到一些选项:

  • 在锚标记上添加一个
    click.trigger
    事件侦听器。单击后,您的检查在注入的
    BrowserHistory
    history上会有点粗糙(它模仿了框架的功能)。\u getFragment(DefaultLinkHandler.getEventInfo(event.href)==history.fragment
    。如果计算结果为true,则您位于同一页面上,路由器不会执行任何操作,因此轮到您向EventAggregator发布某些内容

  • 或者更简单(但更容易出现问题/边缘情况)的替代方法:注册一个单击事件,该事件只需将
    href
    属性与
    window.location.href
    或其一些好友进行比较

  • 使用
    navigationStrategy.replace
    (不推荐,因为它会无缘无故地重做整个组件,但这是一个选项)

  • this.fragment==fragment
    全局执行此操作时,重写发布到EventAggregator(第138行或index.js的某些内容)的
    BrowserHistory
    类的
    navigate()
    方法,并将其作为
    History
    向DI注册


我将弗雷德·克洛弗的答案标记为答案,因为我觉得他的方法虽然更难实现,但可能更强大。但您还需要了解框架的内部工作原理。最后,我实现了一种解决问题的黑客方法。我创建了一个名为
导航到页面链接的自定义元素

导航到page-link.ts


嘿,谢谢你分享你最后做的事。我可能误解了你的限制。您是否只是希望在导航时关闭菜单,而不管您是导航到当前页面还是其他页面?在这种情况下,我会建议比我现在建议的更干净的解决方案:)
import { bindable, autoinject } from 'aurelia-framework';
import { Store } from 'aurelia-store';
import { State } from '@src/state/state';
import { MenuStateActions } from '../menu-state';

@autoinject()
export class NavigateToPageLink{
  @bindable route: string;
  @bindable name: string;

  constructor(private store: Store<State>){}

  closeMenu(){
    this.store.dispatch(MenuStateActions.close);
    return true;
  }
}
<template>
  <a route-href="route.bind: route" click.delegate="closeMenu()" class="menu-item">${name}</a>
</template>
<require from="./navigate-to-page-link"></require>
<navigate-to-page-link route="home" name="Home"></navigate-to-page-link>