【问题标题】:How do I make Aurelia match routes exactly?如何使 Aurelia 完全匹配路线?
【发布时间】:2018-08-19 00:55:00
【问题描述】:

我正在尝试使用 Aurelia 制作一个简单的应用程序,但我不喜欢我的路由最终匹配带有额外内容的 url。

我的路由器配置是:

configureRouter(config, router) {
  config.title = 'Aurelia';
  config.map([
    { route: '', redirect: 'players' },
    { route: 'players', name: 'players', moduleId: 'components/players/players', nav: true, title: 'Players' }
  ]);
  this.router = router;
}

我只希望#/players 路由到播放器组件。如何防止#/players/extra/url 之类的内容也被路由?

【问题讨论】:

标签: javascript routing aurelia


【解决方案1】:

这就是route-recognizer 的工作原理。一旦找到完全匹配的叶子路由,它就会停止查看 url 的其余部分。相反,如果您有另一条路线#/players/foo,那么#/players/extra 会给您一个错误Route not found: extra

考虑到这一点,您可以添加一个带有子路由匹配器的附加路由配置来捕获额外的部分:

{ route: 'players/*path', redirect: 'players' }

然后,用户在#/players/ 之后添加的任何内容都将被删除,它们仍会出现在该页面上。

但要小心这种事情,因为它会破坏您可能拥有的任何子路由,并且可能不是用户期望的行为。即使在堆栈溢出时,您也可以在地址栏中添加/extra/stuff 并进入同一页面。

【讨论】:

  • 谢谢,这似乎是正确的解决方案,尽管我路由到一个未找到的页面而不是重定向。这对stackoverflow上url中的额外内容很有趣——我担心在同一个页面上有多个URL会是一种不好的风格。
  • 不,这不是糟糕的风格,虽然我同意它会让人觉得有点难看。大多数客户端路由识别器都是Nondeterministic Finite Automata 的某种形式,它们的工作方式大致相同(如果您感兴趣:nathanhammond.com/route-recognizer)。最终拥有多个指向同一页面的网址只会提高可访问性。
  • 方法完全正确。不过,我认为原因略有不同。 Aurelia 延迟加载子路由器,因此一旦找到部分匹配的叶路由,它会将其余路由转发到子路由器,即使不存在。我认为目前没有什么好的办法。
  • @MatthewJamesDavis 我对原因的描述不是不完整而不是不正确吗?我现在正试图完全理解它。所以:route-recognizer 一旦找到匹配项,就会停止查看路线的其余部分。它忽略extra/url 并让任何子路由器的route-recognizer 处理它。页面已加载,不存在configureRouter();没有配置路由器或路由识别器,因此extra/url 根本不被任何东西处理,实际上被忽略了。这是正确的吗?
猜你喜欢
  • 2017-12-26
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多