2014-02-27 20 views
0

我在這裏做錯了什麼想要建立一個基於userRole的導航 更新:結果是對象console.log(result); enter image description here console.log(JSON.stringify(result));給我這個回Durandal建立基於用戶角色的路線

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 }); 
} 

,那麼這將無法工作數據綁定=「的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; 
+0

爲什麼你將一個字符串數組傳遞給'router.map'?是否有可能'var routesArray = JSON.stringify(result);'應該解析而不是字符串化? –

+0

,因爲示例2工作正常,並且自routesArray = JSON。字符串化(結果);我認爲這將工作就像在示例2 –

+0

[使用路由器](http://durandaljs.com/documentation/Using-The-Router.html)中的第二個代碼示例顯示路由器接收解碼陣列。 –

回答

1

的評論來自@麥克 - 塞繆爾是正確的。 JSON.stringify會返回一個字符串。當您將一個字符串傳遞給路由器時,它假定該字符串表示路由。以下是router.map的代碼;在你的情況下,你使用'route'作爲字符串,並且你沒有傳入'config'對象,所以路由器會爲你創建一個配置文件,並將你的「路由」(字符串數組)設置爲路由參數:

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將任何對象轉換爲「數組」(實際上將其轉換爲字符串)。事前是什麼東西?如果數組已經那麼你應該能夠直接傳遞到路由器:

​​

或者,如果結果是一個字符串,那麼你很可能想要做一個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()有在那裏三通,以及我能夠將它們與我的觀點聯繫起來。原始源代碼中有一些不匹配的引號 - 也許這就是扔你的東西?

+0

我做了一些更新的代碼,你可以請檢查它router.map(result).buildNavigationModel();不起作用 –

+0

你能更具體嗎?正如我所說,**精確的**代碼正在爲我工​​作,並且它基於您提供的代碼。你有沒有一個我們可以在某處查看你的解決方案的URL?必須有另一個難題失蹤。 – gerrod

+0

return router.map(result).buildNavigationModel()。mapUnknownRoutes('account/login','not-found');工作正常謝謝你的幫助 –

0

登錄console.log(JSON.stringify(result));,但你SE JSON.stringify(resultSetB)

resultSetB的代替結果