我已經構建了一個應用程序,並且想要顯示一個兩層菜單,並且這兩個層始終可用。 Durandal 2.0 introduced their new router,支持「子路由器」,可以更輕鬆地進行深度鏈接。Durandal 2.0 - 用於嵌套菜單的子路由器?
我的問題 - 我可以有我的「孩子」的航行路線永久裝載(當父母不活躍的子菜單呈現的),或者是「子路由器的設計旨在懶加載它們來評估他們曾經深度鏈接被評估?
的迪朗達爾示例顯示主導航註冊一個圖示的路線,然後當視圖模型被加載/激活,子路由器被登記。
例如:在具備迪朗達爾2.0的例子中,勉內華達州被登記在shell.js
router.map([
{ route: ['', 'home'], moduleId: 'hello/index', title: 'Validation test', nav: true },
{ route: 'knockout-samples*details', moduleId: 'ko/index', title: 'Knockout Samples', nav: true, hash: '#knockout-samples' }
]).buildNavigationModel()
.activate();
然後是ko/index.js
視圖模型註冊兒童(上activate()
)
var childRouter = router.createChildRouter()
.makeRelative({
moduleId:'ko',
fromParent:true
}).map([
{ route: '', moduleId: 'helloWorld/index', title: 'Hello World', type: 'intro' },
{ route: 'helloWorld', moduleId: 'helloWorld/index', title: 'Hello World', type: 'intro', nav: true},
{ route: 'clickCounter', moduleId: 'clickCounter/index', title: 'Click Counter', type: 'intro', nav: true}
]).buildNavigationModel();
鑑於我期待在一個地方定義我的路線,例如:
var routes = [
{ route: ['', 'home'],
moduleId: 'hello/index',
title: 'Validation test',
nav: true },
{ route: 'knockout-samples*details',
moduleId: 'ko/index',
moduleRootId: 'ko', // Custom property to make child routes easier
title: 'Knockout Samples',
nav: true,
hash: '#knockout-samples',
childRoutes: [
{ route: '', moduleId: 'helloWorld/index', title: 'Hello World', type: 'intro' },
{ route: 'helloWorld', moduleId: 'helloWorld/index', title: 'Hello World', type: 'intro', nav: true},
{ route: 'clickCounter', moduleId: 'clickCounter/index', title: 'Click Counter', type: 'intro', nav: true}
]}
])
而我正在努力的部分是註冊孩子的路線,並讓他們在瀏覽時正確地蒸發。 (渲染菜單稍後會出現...)
// Load routes router.map(routes.navRoutes).buildNavigationModel().mapUnknownRoutes(function(instruction)
{
logger.logError('No Route Found', instruction.fragment, 'main', true);
});
// Try load child routes...
$.each(routes.navRoutes, function(index, parentRoute) {
if (!parentRoute.childRoutes) {
return;
}
var childRouter = router.createChildRouter()
.makeRelative({
moduleId: parentRoute.moduleRootId,
fromParent: true // also tried false + non-splat routes...
}).map(parentRoute.childRoutes).buildNavigationModel();
});
我在獲取此導航欄時遇到了各種錯誤。當試圖計算哈希時(主要來自未激活的父項或子項),主要是內部的router.js錯誤 - 因此所有哈希都已定義。
一旦我得到它來映射導航,子路徑似乎無法訪問 - 他們只是無誤地加載主圖示頁面。
所以我想知道如果我正確地做這件事嗎? (預先註冊所有兒童路線,目標是呈現兩層菜單)。
我在考慮使用諸如Durandal 1.2 answer about subrouting之類的東西,使用平面路由註冊,自定義'isSameItem'函數&計算的observables來呈現2層導航。
我以前在路由器對象上使用了不同的方法來做到這一點,但我認爲這有點優雅,我非常喜歡這個解決方案。 – MattSizzle