在我看来......这样的初始路线是通过以下方式定义的:
{ route: '', moduleId: 'viewmodels/customers', title: 'customers', nav: true },
当应用程序加载路径''
时,必须奇怪地设置为空,然后最初加载此路由。
当我现在导航到mysite /#/ customers时,没有任何内容被加载。
如何为我的路线提供一个起始模块,我可以用它来导航到它?
在旧路由器中我使用了startModule,但我在durandal 2.0中找不到它。
答案 0 :(得分:6)
您可能需要设置具有相同moduleId
的第二条路线。以下是使用此http://dfiddle.github.io/dFiddle-2.0/#hello和http://dfiddle.github.io/dFiddle-2.0
define(['plugins/router', 'durandal/system', 'global', 'knockout'], function( router, system, global, ko ) {
var childRouter = router.createChildRouter()
.makeRelative({
moduleId: 'hello',
route: 'hello'
}).map([
{route: '', moduleId: 'default/index', title: 'Hello World', type: 'intro'},
{route: 'default', moduleId: 'default/index', title: 'Hello World', type: 'intro', nav: true},
{route: 'dFiddle', moduleId: 'dFiddle/index', title: 'Hello World', type: 'fiddle', nav: true}
]).buildNavigationModel();
// .on is mixed in an not meant to be chainable
childRouter.on('router:navigation:complete').then(global.createSampleLink);
return {
global: global,
router: childRouter,
getItemsByCategoryId: function( categoryId ) {
return ko.utils.arrayFilter(childRouter.navigationModel(), function( route ) {
return route.type === categoryId;
});
},
binding: function() {
system.log('Lifecycle : binding : hello/index');
return { cacheViews: false }; //cancels view caching for this module, allowing the triggering of the detached callback
}
};
});
这个在所有主要路由上都有子路由的特定设置使用router.guardRoute
中的shell.js
来处理空根情况。有一个开放票[{3}},讨论如何更好地处理这类边缘案例。
define(['plugins/router'], function (router) {
// Redirecting from / to first route
router.guardRoute = function(routeInfo, params, instance){
if (params.fragment === ''){
return routeInfo.router.routes[0].hash;
}
return true;
};
return {
router: router,
activate: function () {
router.map([
{ route: '', moduleId: 'hello/index', title: 'Hello World' },
{ route: 'hello*details', hash: '#hello', moduleId: 'hello/index', title: 'Hello World', nav: true },
...
]).buildNavigationModel();
return router.activate();
}
};
});
答案 1 :(得分:4)
您可以声明这样的路线:
routes = [
{ route: ['welcome', ''], title: 'Welcome', moduleId: 'welcome', nav: true },
{ route: 'Visits', title: 'Visits', moduleId: 'Visits', nav: true },
{ route: 'VisitAddEdit', title: 'Add New Vsit', moduleId: 'VisitAddEdit', nav: true }
];
注意welcome
路由如何声明为数组(['welcome', '']
),除了名称外还包含空字符串。
答案 2 :(得分:0)
这可能不是最好的长期解决方案,但我的修复方法是在router.activate()的options对象中传入一个startUrl然后更改一行history.js(第163行,结束激活功能):
return history.loadUrl(options.startUrl);
在我设置路由器映射和buildNavigationModel:
后,我这样称呼它router.activate({startUrl: 'hello'});
希望这有助于快速解决问题。
修改强>
要获取要更新的URL,我将其更改为history.navigate(options.startUrl)而不是loadUrl。