1

在我正在处理的 Durandal 应用程序中,有一个顶部带有选项卡的页面,可将用户带入子视图。这些选项卡工作完美,配置如下:

var childRouter = router.createChildRouter()
    .makeRelative({ moduleId: 'viewmodels/admin/sections', fromParent: true })
    .map([
        { route: [''], moduleId: 'index', title: 'Admin', nav: false },
        { route: 'settings', moduleId: 'settings', title: 'Settings', nav: true },
        ...
    ]).buildNavigationModel();

我还有一个导航功能,每次单击选项卡时都会执行,如下所示:

function navigate(route) {
    router.navigate(route.hash, { replace: true, trigger: true });
}

页面的 URL 按预期更新。从默认管理子视图 ( .../#admin) 转到设置选项卡会将 URL 更新为.../#admin/settings. 但是问题是,尽管replace: true指定了视图更改,但似乎并未存储在浏览器历史记录中。

如果我在页面上打开一个新的浏览器选项卡#admin并导航到该#admin/settings页面,浏览器似乎认为在此之前唯一的历史条目是打开新选项卡:

浏览器缺乏历史

如果我随后完全离开该部分,我打开的最后一个选项卡似乎确实会在浏览器历史记录中被记住(在这种情况下,是我打开的设置选项卡),但事先访问#admin的主页没有条目:#admin

浏览器历史,但还不够

如果我从#adminto#admin/settings然后返回,#admin我只会在历史记录中看到对主 Admin 页面的引用,而没有提及 Settings 页面。

有谁知道我错过了什么会阻止每次子视图更改时更新历史记录?

4

1 回答 1

0

我发现.mapUnknownRoutes()留空而不是定义要映射的页面可以完全解决问题。

我正在这样做:

.mapUnknownRoutes('not-found', 'not-allowed')

现在我正在这样做:

.mapUnknownRoutes()

似乎没有任何问题('not-found''not-allowed'页面仍然可以访问),但现在后退按钮可以按预期工作。

于 2016-10-24T10:19:42.750 回答