使用带有Durandal应用程序的多个Roots

时间:2013-04-15 15:30:49

标签: single-page-application durandal

问题:

我的申请没有开始;它只是进入一个无限循环。

代码:

我的app.start:

app.start().then(function() {
            //Replace 'viewmodels' in the moduleId with 'views' to locate the view.
            //Look for partial views in a 'views' folder in the root.
            viewLocator.useConvention();

            //configure routing
            router.useConvention();

            router.mapNav('home');
            router.mapNav('intro');
            router.mapNav('error');
            router.mapRoute('set/:id', 'viewmodels/set', 'Set');
            router.mapRoute('folder/:id', 'viewmodels/folder', 'Folder');
            router.mapRoute('api', 'viewmodels/api', 'API Reference');


            app.adaptToDevice();

            app.setRoot('viewmodels/intro');
            //logger.logError('No route found', route, 'main', true);
            /*
            router.handleInvalidRoute = function (route, params) {
                //debugger;
                //router.navigateTo('#/error');
            };
            */
        });

我将root设置为intro,其中包含一个具有登录功能的简单viewmodel:

define(['durandal/app', 'durandal/plugins/router', 'services/dataservice'], function (app, router, dataservice) {
var introViewModel = function () {

    var self = this;
    self.router = router;

    self.logIn = function () {
        app.setRoot('viewmodels/shell');
    };

    self.activate = function () {
        return router.activate('intro');
    };

这里的目标是在用户登录时重新设置应用程序的根目录。任何想法我做错了什么?

3 个答案:

答案 0 :(得分:1)

根据Rob在Google网上论坛页面上的回答,这里有一些对我有用的细节可能有助于其他人:

  • 在main.js app.start()。then():将root设置为您的登录页面。

  • 登录后,配置路由器并添加路由。 (添加 在路由器激活之前,路由必须。)这是一个机会 仅检索用户有权访问的路由 登录过程。

  • 最后,将app root设置为shell,然后激活 路由器使用您指定的默认路由。目前,我修改了 激活路由器中的功能以获取a的附加参数 启动网址 - 这样,如果需要,我可以绕过默认页面。

答案 1 :(得分:0)

Per Rob over the Google Groups,我刚从我的介绍页面中取出路由器并在我的shell.js中运行它,只激活路由器一次。这似乎收紧了一点,应用程序现在正在运行:

https://groups.google.com/forum/#!topic/durandaljs/RdGpwIm1oOU

答案 2 :(得分:0)

根据你的回答,第一部分(setroot to login),我做了这个,但登录页面没有加载,也没有显示错误。

主要我简单地把app.setRoot('viewmodels / login','entrance');

登录时我只有一个激活功能:

function activate() {
    return true;
}

这是对的吗?