使用浏览器的后退按钮时,Durandal 子视图不会添加到历史记录中并被忽略

Durandal child views not adding to history and being ignored when using the browser's back button

在我正在处理的 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 主页面的条目:

如果我从 #admin 转到 #admin/settings 然后再回到 #admin,我只会在历史记录中看到对主管理页面的引用,而不会提及设置页面。

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

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

我是这样做的:

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

现在我正在这样做:

.mapUnknownRoutes()

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