2

在我看来......这样初始路线是通过以下方式定义的:

{ route: '', moduleId: 'viewmodels/customers', title: 'customers', nav: true },

当应用程序加载了''必须奇怪地设置为空的路由时,最初会加载该路由。

当我现在导航到 mysite/#/customers 时,什么都没有加载。

我怎样才能给我的路线一个起始模块,我可以用它来导航到它?

在旧路由器中,我使用了 startModule,但在 durandal 2.0 中找不到它。

4

3 回答 3

6

您可能需要使用相同的moduleId. 这是使用此http://dfiddle.github.io/dFiddle-2.0/#hellohttp://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处理空根案例。有一张公开票https://github.com/BlueSpire/Durandal/issues/240讨论了如何更好地处理这些边缘情况。

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();
        }
    };
});
于 2013-07-30T08:45:13.347 回答
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', '']) 的,其中除了名称之外还包含一个空字符串。

于 2013-12-16T23:58:12.663 回答
0

这可能不是最好的长期解决方案,但我的解决方法是在 router.activate() 的选项对象中传入一个 startUrl,然后更改 history.js 的一行(第 163 行,激活函数的结尾) :

return history.loadUrl(options.startUrl);

在设置路由器映射和 buildNavigationModel 后,我这样称呼它:

router.activate({startUrl: 'hello'});

希望这有助于快速修复。

编辑

为了同时更新 URL,我将其更改为 history.navigate(options.startUrl) 而不是 loadUrl。

于 2013-09-04T20:31:51.473 回答