这个答案对于使用 Sammy.js 路由器的 Durandal 1.X 是正确的(我还没有使用 2.0 路由器来测试任何东西)
问题是,当您映射路线时,路线的属性不是可观察的。路由器获取您想要映射的路由并映射它们,当需要映射其他路由时,您也需要返回并路由它们。
例子 -
router.map({
url: 'home',
moduleId: 'viewmodels/home',
name: 'Home',
visible: true,
settings: {}
});
return router.activate('home');
并在您的数据加载后,然后加载额外的路线 -
var newRoutes = [{
url: 'other',
moduleId: 'viewmodels/other',
name: 'Other',
visible: true,
settings: {}
}, {
url: 'about',
moduleId: 'viewmodels/about',
name: 'About',
visible: true,
settings: {}
}];
router.map(newRoutes );
编辑
如果您担心路由的放置位置,只需在数据已加载到 config.js 时移动您要加载的所有路由,并且仅在应用启动时加载第一个路由。例子 -
外壳.js
function activate() {
datacontext.loadData().then(loadAllRoutes);
router.map({
url: 'home',
moduleId: 'viewmodels/home',
name: 'Home',
visible: true,
settings: {}
});
return router.activate('home');
}
function loadAllRoutes() {
var routes = config.routes;
router.map(routes);
}
替代
如果您想隐藏/显示基于不同事件的路线,但仍要同时加载它们,只需使用您的导航栏获得更多创意。可见性切换仍设置为可见,但您可以使用类似
<ul class="nav">
// Show home route always
<li>Home</li>
<!-- ko foreach: visibleRoutes -->
<li>(Put routes here)</li>
<!-- /ko -->
</ul>
并在你的 shell 中创建一个 observable,在数据加载完成时将 dataLoaded 从 false 更改为 true。
var dataLoaded = ko.observable(false);
function activate() {
datacontext.loadData().then(loadAllRoutes);
var routes = config.routes;
router.map(routes);
return router.activate(config.startModule);
}
function loadAllRoutes() {
dataLoaded(true);
}