在 Aurelia Router 中,是否可以在用户尝试导航到同一页面时收到通知?
In Aurelia Router is it possible to get notified when the user attempts to navigate to the same page?
我可以订阅的Aurelia Router fires off events in the EventAggregator。我的代码订阅了 router:navigation:processing
事件,这样每当用户点击一条路线时,我的导航菜单就会关闭。
eventAggregator.subscribe('router:navigation:processing', e => menu.close());
问题是当用户在他们试图导航到的页面上时,菜单保持打开状态。当他们 select 当前所在的同一页面时,我想关闭菜单。
我还想提一下,我的菜单链接是这样的:
<a route-href="route:showcase" class="menu-item">Showcase</a>
如果可能的话,我希望保持这样的链接,因为我喜欢 aurelia-router
自动绑定 href
地址的方式。
不,没有真正的内置机制。 history-browser
负责拦截锚标签的点击事件,并将url片段发送给routeHandler。
只有当新片段与旧片段不同时才会这样做(或如果navigationStategy是'replace');如果不是,操作在路由器参与之前很久就中止了。
根据您需要它的频率以及值得投入多少时间等,我想到了一些选择:
在锚标签上添加一个 click.trigger
事件侦听器。单击时,您的检查在注入的 BrowserHistory
: history._getFragment(DefaultLinkHandler.getEventInfo(event).href) === history.fragment
上会有点乱(它模仿框架的作用)。如果这评估为真,则您在同一页面上并且路由器不会执行任何操作,因此轮到您向 EventAggregator 发布内容。
或者更简单(但更容易出现问题/边缘情况)的替代方法:注册一个点击事件,简单地将 href
属性与 window.location.href
或某些属性进行比较它的朋友。
使用navigationStrategy.replace
(不推荐,因为它会无缘无故地重做你的整个组件,但这是一个选项)
覆盖 BrowserHistory
class 的 navigate()
方法,当 this.fragment === fragment
在全球范围内执行此操作,并在 DI 中将其注册为 History
我将 Fred Kleuver 的回答标记为答案,因为我觉得他的方法虽然更难实施,但可能更强大。但您还需要了解框架的内部工作原理。最后,我只是实施了一种解决问题的 hacky 方法。我创建了一个名为 navigate-to-page-link
.
的自定义元素
导航到页面-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;
}
}
导航到页面-link.html
<template>
<a route-href="route.bind: route" click.delegate="closeMenu()" class="menu-item">${name}</a>
</template>
所以,基本上我使用 aurelia-store
打开和关闭我的菜单。此外,我需要从 click.delegate
方法 return true
以便 href
link 导航。
在我的菜单中,我这样使用这个元素:
<require from="./navigate-to-page-link"></require>
<navigate-to-page-link route="home" name="Home"></navigate-to-page-link>
我可以订阅的Aurelia Router fires off events in the EventAggregator。我的代码订阅了 router:navigation:processing
事件,这样每当用户点击一条路线时,我的导航菜单就会关闭。
eventAggregator.subscribe('router:navigation:processing', e => menu.close());
问题是当用户在他们试图导航到的页面上时,菜单保持打开状态。当他们 select 当前所在的同一页面时,我想关闭菜单。
我还想提一下,我的菜单链接是这样的:
<a route-href="route:showcase" class="menu-item">Showcase</a>
如果可能的话,我希望保持这样的链接,因为我喜欢 aurelia-router
自动绑定 href
地址的方式。
不,没有真正的内置机制。 history-browser
负责拦截锚标签的点击事件,并将url片段发送给routeHandler。
只有当新片段与旧片段不同时才会这样做(或如果navigationStategy是'replace');如果不是,操作在路由器参与之前很久就中止了。
根据您需要它的频率以及值得投入多少时间等,我想到了一些选择:
在锚标签上添加一个
click.trigger
事件侦听器。单击时,您的检查在注入的BrowserHistory
:history._getFragment(DefaultLinkHandler.getEventInfo(event).href) === history.fragment
上会有点乱(它模仿框架的作用)。如果这评估为真,则您在同一页面上并且路由器不会执行任何操作,因此轮到您向 EventAggregator 发布内容。或者更简单(但更容易出现问题/边缘情况)的替代方法:注册一个点击事件,简单地将
href
属性与window.location.href
或某些属性进行比较它的朋友。使用
navigationStrategy.replace
(不推荐,因为它会无缘无故地重做你的整个组件,但这是一个选项)覆盖
BrowserHistory
class 的navigate()
方法,当this.fragment === fragment
在全球范围内执行此操作,并在 DI 中将其注册为History
我将 Fred Kleuver 的回答标记为答案,因为我觉得他的方法虽然更难实施,但可能更强大。但您还需要了解框架的内部工作原理。最后,我只是实施了一种解决问题的 hacky 方法。我创建了一个名为 navigate-to-page-link
.
导航到页面-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;
}
}
导航到页面-link.html
<template>
<a route-href="route.bind: route" click.delegate="closeMenu()" class="menu-item">${name}</a>
</template>
所以,基本上我使用 aurelia-store
打开和关闭我的菜单。此外,我需要从 click.delegate
方法 return true
以便 href
link 导航。
在我的菜单中,我这样使用这个元素:
<require from="./navigate-to-page-link"></require>
<navigate-to-page-link route="home" name="Home"></navigate-to-page-link>