【问题标题】:Durandal build the route based on userRoleDurandal 基于 userRole 构建路由
【发布时间】:2014-02-28 15:02:03
【问题描述】:

我在这里做错了什么想要基于 userRole 构建导航 更新:结果是对象 console.log(result); console.log(JSON.stringify(result)); 把这个还给我

function activate() {
    console.log(appsecurity.userInfo());

    if (typeof (appsecurity.userInfo()) === 'Administrator'){
        return privateAccess();

    } else {
        return publicAccess();
    }

    router.on('router:route:not-found', function (fragment) {
        logError('No Route Found', fragment, true); 
    });
}

var courses = [
    { route: '', title:'Welcome', moduleId: 'viewmodels/welcome', nav: true, type: 'guest' , authorize: ["User", "Administrator"]},
    { route: 'flickr', moduleId: 'viewmodels/flickr', nav: true, authorize: ["User"] },
    { route: 'youtube', moduleId: 'viewmodels/youtube', nav: true, type: 'member' },
    { route: 'facebook', moduleId: 'viewmodels/facebook', nav: true, authorize: ["Administrator"] },
    { route: 'skype', moduleId: 'viewmodels/skype', nav: true, authorize: ["User", "Administrator"] }
] ;  

var acceptedTypes = ["Administrator", "Visitor"];

var result = (function(authTypes) {
    var results = [], i, j, k, works;

    for(i=0; i<courses.length; i++) {
        if(courses[i]&&courses[i].authorize&&courses[i].authorize.length) {
            works = false;
            for(j=0; j<courses[i].authorize.length; j++) {
                for(k=0; k<authTypes.length; k++) {
                    works = works || courses[i].authorize[j] === authTypes[k];
                }
            }

            if(works)
                results.push(courses[i]);
        }
    }

    return results;
}) (acceptedTypes);

console.log(JSON.stringify(result)); 

function privateAccess() {
    return router.map(result)            // Map the routes
        .buildNavigationModel() // Finds all nav routes and readies them
        //TODO!?: .mapUnknownRoutes("notfound","notfound")
        .mapUnknownRoutes('account/login', 'not-found')
        .activate();            // Activate the router
        //.activate({ pushState: true });
}

那么这将不起作用 data-bind="foreach: router.navigationModel"EMPTY 并且我在控制台中看不到任何错误

var routesArray = JSON.stringify(result);
router.makeRelative({ moduleId: 'viewmodels' }); // router will look here for viewmodels by convention
router.map(routesArray).buildNavigationModel();

return router.makeRelative({ moduleId: 'viewmodels' }).map(routesArray).mapUnknownRoutes('account/login', 'not-found').buildNavigationModel();

但这会起作用

router.makeRelative({ moduleId: 'viewmodels' }); // router will look here for viewmodels by convention

router.map([
    { route: '', title:'Welcome', moduleId: 'viewmodels/welcome', nav: true, type: 'guest' , authorize: ["User", "Administrator"]},
    { route: 'flickr', moduleId: 'viewmodels/flickr', nav: true, authorize: ["User"] },
    { route: 'youtube', moduleId: 'viewmodels/youtube', nav: true, type: 'member' },
    { route: 'facebook', moduleId: 'viewmodels/facebook', nav: true, authorize: ["Administrator"] }
    { route: 'skype', moduleId: 'viewmodels/skype', nav: true, authorize: ["User", "Administrator"] }
]).buildNavigationModel();

return router;

【问题讨论】:

  • 为什么要将字符串化数组传递给router.mapvar routesArray = JSON.stringify(result); 是否应该解析而不是字符串化?
  • 因为示例 2 运行良好,并且由于 routesArray = JSON.stringify(result);我在想这将像示例 2 中一样工作
  • Using The Router 中的第二个代码示例显示路由器接收解码后的数组。
  • 我试过 router.map().apply(this, routesArray).buildNavigationModel();但它不起作用

标签: javascript durandal


【解决方案1】:

@mike-samuel 的评论是正确的。 JSON.stringify 将返回一个字符串。当您将字符串传递给路由器时,它假定该字符串表示路由。这是来自router.map 的代码;在您的情况下,您将“路由”用作字符串,并且您没有传入“配置”对象,因此路由器将为您创建一个配置并将您的“路由”(字符串化数组)设置为路由参数:

router.map = function(route, config) {
    if (system.isArray(route)) {
        for (var i = 0; i < route.length; i++) {
            router.map(route[i]);
        }

        return router;
    }

    if (system.isString(route) || system.isRegExp(route)) {
        if (!config) {
            config = {};
        } else if (system.isString(config)) {
            config = { moduleId: config };
        }

        config.route = route;
    } else {
        config = route;
    }

    return mapRoute(config);
};

路由器稍后将继续尝试从您的数组中创建一个正则表达式,我只能想象事情从这里开始变得一团糟。

您使用 JSON.stringify 将任何对象转换为“数组”(实际上将其转换为字符串)似乎很可疑。之前的对象是什么?如果它已经是一个数组,那么您应该能够将它直接传递给路由器:

// Map the result directly - do not stringify!
router.map(result).buildNavigationModel();

或者,如果结果是一个字符串,那么你可能想要做一个 JSON.parse:

// PARSE the result string as an array
var routesArray = JSON.parse(result);
router.makeRelative({ moduleId: 'viewmodels' });
router.map(routesArray).buildNavigationModel();

顺便说一句,我看不到您的 router 声明的位置,但我推测您在某处将其设为子路由器,而不是尝试使用根路由器?

router = rootRouter.createChildRouter()

编辑

根据您更新的代码,我将其复制到我的应用程序中,如下所示:

var courses = [
    { route: '', title: 'Welcome', moduleId: 'viewmodels/welcome', nav: true, type: 'guest', authorize: ["User", "Administrator"] },
    { route: 'flickr', moduleId: 'viewmodels/flickr', nav: true, authorize: ["User"] },
    { route: 'youtube', moduleId: 'viewmodels/youtube', nav: true, type: 'member' },
    { route: 'facebook', moduleId: 'viewmodels/facebook', nav: true, authorize: ["Administrator"] },
    { route: 'skype', moduleId: 'viewmodels/skype', nav: true, authorize: ["User", "Administrator"] }
];

var acceptedTypes = ["Administrator", "Visitor"];

var result = (function (authTypes) {
    var results = [], i, j, k, works;

    for (i = 0; i < courses.length; i++) {
        if (courses[i] && courses[i].authorize && courses[i].authorize.length) {
            works = false;
            for (j = 0; j < courses[i].authorize.length; j++) {
                for (k = 0; k < authTypes.length; k++) {
                    works = works || courses[i].authorize[j] === authTypes[k];
                }
            }

            if (works)
                results.push(courses[i]);
        }
    }

    return results;
})(acceptedTypes);

console.log(JSON.stringify(result));

var child = rootRouter.createChildRouter();
child.map(result).buildNavigationModel();

var nav = child.navigationModel;

debugger;

在调试器中,当我评估nav() 时,那里有三个链接,我能够将它们绑定到我的视图。您的原始源代码中有一些不匹配的引号 - 也许这就是让您感到困惑的原因?

【讨论】:

  • 我对代码做了一些更新,请您检查一下 router.map(result).buildNavigationModel();不工作
  • 你能说得更具体点吗?正如我所说,exact 代码对我有用,它基于您提供的代码。您是否有一个 URL,我们可以在某个地方查看您的解决方案?一定还有另一块拼图缺失。
  • return router.map(result).buildNavigationModel().mapUnknownRoutes('account/login', 'not-found');工作正常,谢谢您的帮助
  • 太棒了 - 很高兴我们最终到达了那里:-)
【解决方案2】:

您登录console.log(JSON.stringify(result));,但使用JSON.stringify(resultSetB)

resultSetB 而不是 result

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 2013-05-16
    • 2013-05-21
    • 2018-04-19
    • 2012-05-01
    • 2019-01-30
    • 2013-09-03
    • 1970-01-01
    相关资源
    最近更新 更多