gpt4 book ai didi

javascript - 如何在 Durandal 中显示带有参数化路由的 "not found"页面

转载 作者:行者123 更新时间:2023-11-30 12:18:39 25 4
gpt4 key购买 nike

我有一个 Durandal 应用程序,如果 URL 与已知路由不对应,我会使用 router.mapUnknownRoutes 显示一个用户友好的错误页面。这工作正常——如果我去,说 /foo,并且它不匹配路由,那么 mapUnknownRoutes 指定的模块会正确显示。

但是,当我有一个参数化路由时,我找不到任何方法来显示相同​​的错误页面,并且该参数与后端的任何内容都不匹配。

例如,假设我有一个类似 people/:slug 的路由,其中​​相应模块的 activate 方法如下所示:

this.activate = function (slug) {
dataService.load(slug).then(function () {
// ... set observables used by view ...
});
};

如果我去,比如 /people/foo,那么结果取决于 dataService.load('foo') 返回数据还是错误:

  • 如果 foo 存在于后端,那么没问题 - 可观察对象已设置且合成继续。
  • 如果 foo 不存在,则抛出错误(因为没有 catch)。这会导致未处理的错误,导致导航被取消并且路由器停止工作。

我知道我可以从 canActivate 返回 false 并且导航将以更干净的方式取消而不会阻塞路由器。然而,这不是我想要的;我想要一个无效的 URL 来告诉用户出了点问题。

我知道我可以从 canActivate 返回 { redirect: 'not-found' } 或类似的东西。然而,这很糟糕,因为它破坏了后退按钮——在重定向发生后,如果用户按下后退,他们将返回到 /people/foo ,这会导致另一个错误,因此另一个重定向回 未找到

我尝试了几种不同的方法,主要涉及向 promise 定义添加 catch 调用:

this.activate = function (slug) {
dataService.load(slug).then(function () {
// ... set observables used by view ...
}).catch(function (err) {
// ... do something to indicate the error ...
});
};
  • activate(或canActivate)能否通知路由器该路由实际上是无效的,就好像它从来没有匹配过一样?
  • activate(或canActivate)是否可以发出rewrite(相对于redirect)以便路由器将在不更改 URL 的情况下显示不同的模块?
  • 我可以直接组合一些其他模块来代替当前模块(并取消当前模块的组合)吗?

我还尝试了一个空的 catch block ,它吞下了错误(我可以在这里添加一个 toast 来通知用户,这总比没有好)。但是,这会导致很多绑定(bind)错误,因为从未设置 View 期望的可观察对象。可能我可以将整个 View 包装在 if 绑定(bind)中以防止错误,但这会导致空白页面而不是错误消息;或者我必须将错误消息放入可能无法检索其数据的每个 View 中。无论哪种方式,这都是 View 污染而不是 DRY,因为我应该只写一次“未找到”错误消息。

我只想要一个无效的 URL(特别是一个与路由匹配但包含无效参数值的 URL)来显示一个显示“找不到页面”的页面。这肯定也是其他人想要的东西吧?有什么办法可以实现吗?

最佳答案

我认为您应该能够使用 activatecanActivate 方法中的以下内容。

router.navigate('not-found', {replace: true});

关于javascript - 如何在 Durandal 中显示带有参数化路由的 "not found"页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31703448/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com