2

我是一個初學者試圖瞭解SPA /迪朗達爾,淘汰賽等..迪朗達爾2.0「路線」

需要一些幫助,我的路線爲聯繫下拉按鈕。

這裏是我的路線在shell.js至今:

var routes = [ 
      { route: '', moduleId: 'home', title: 'Home', nav: 1 }, 
      { route: 'downtime', moduleId: 'downtime', title: 'Downtime', nav: 2 }, 
      { route: 'downtimeadd', moduleId: 'downtimeadd', title: 'Add A New Downtime', nav: false, settings: { admin: true } }, 
      { route: 'production', moduleId: 'production', title: 'Production', nav: 4 }]; 

我還創建了adminRoutes在shell.js綁定到與KO的觀點:

var adminRoutes = ko.computed(function() { 
     return router.routes.filter(function (r) { 
      return r.settings.admin; 
     }); 
    }); 

從研究中,他們說router.routes是一個數組,但是當我將它綁定到我的視圖時,按鈕顯示下拉菜單中的0個項目。

當我做(下)我可以得到所有的路線,但我只需要在管理路線...

var adminRoutes = ko.computed(function() { 
     return router.routes; 
    }); 

我應該如何進行?它好像router.routes實際上不是一個數組? 如果我嘗試打印到控制檯:

console.log(router.routes[0]); //Chrome says its undefined... 
console.log(router.routes); //Shows array of size 4... 

燁不知道...幫助將不勝感激!

更新: ------------------------------------------ -------------------------

即使在RainerAtSpirit的建議之後,當我在代碼中進行篩選時仍然會得到一個空數組。

var router = require('plugins/router'); 
//Array size 4 
console.log(router.routes); 

//Array size 0 
console.log(router.routes.filter(function (r) { return r; })); 

然而,當我在「鉻控制檯」運行此:

var router = require('plugins/router') 
router.routes.filter(function (r) { return r; }) 

我得到的陣列回來,所以我不知道爲什麼在代碼中這是行不通的。

+1

在這裏檢查一個答案,應該可以幫助你 - http://stackoverflow.com/questions/17665615/how-to-use-dropdowns-for-durandal-navigation/17666712#17666712 –

+0

看起來像過濾器不因爲它使用'r.setting.admin'進行測試,但是'settings'沒有在每個配置中定義。如果您擺脫了設置對象,例如只需使用'admin:true'即可。 – RainerAtSpirit

+0

@RainerAtSpirit如果我的理解是正確的,如果將我的路由從'settings:{admin:true}'更改爲'admin:true',並按'r.admin'過濾,我仍然得到一個0數組。 –

回答

0

我得到這個工作,但也許不是完美的,我想。

我注意到的第一個問題是其他人沒有看到的問題。在我的示例中(使用VS 2013的HotTowel模板版本1.1的druandal 2.0),我注意到添加adminRoutes的這個代碼在activate方法之前被調用。因此,我的route.routes是一個空數組。爲了解決這個問題,我轉而使用路由數組從config.js中獲取映射(注意:config.routes而不是路由)。路線):

var adminRoutes = ko.computed(function() { 
    return config.routes.filter(function(r) { 
     return r.admin; 
    }); 
}); 

最後,我返回「r.admin」。這是想使工作更好,因爲我加入管理員屬性管理員路線沒有「設置」組的一部分,請參閱「管理員:真」:

var routes = [ 
    { route: '', moduleId: 'equipment', title: 'Equipment', nav: 1 }, 
    { route: 'testresults', moduleId: 'testresults', title: 'Test Results', nav: 2 }, 
    { route: 'testresultdetail/:id', moduleId: 'testresultdetail', title: 'View a test result', nav: false }, 
    { route: 'testresultadd', moduleId: 'testresultadd', title: 'Add a Test Result', nav: false, caption: '<i class="fa fa-plus"></i> Add Test Result', admin: true } 
]; 

有了這兩個變化,菜單項出現了。

0

在您將屬性設置爲可觀察的時候,它將變成函數包裝,因此當您需要獲取實際值時,您需要將其作爲函數來訪問它。這意味着

router.routes[0]將被定義,但router.routes()[0]將工作正確!

您可以嘗試

var adminRoutes = ko.computed(function() { 
     return router.routes().filter(function (r) { 
      return r.settings.admin; 
     }); 
    }); 
+1

很好的建議,在許多情況下都是正確的,但是這次它是錯誤的,因爲router.routes是一個數組。 http://durandaljs.com/documentation/api/#class/Router/property/routes – RainerAtSpirit