2

我是一名初学者,正在尝试学习 SPA / Durandal、Knockout 等...

在我的路线上需要一些帮助以获取管理员下拉按钮。

到目前为止,这是我在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 }];

我还在shell.js中创建了adminRoutes以使用 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; })); 

但是,当我在“ chrome 控制台”中运行它时:

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

我确实得到了数组,所以我不知道为什么在代码中它不起作用。

4

2 回答 2

0

在淘汰赛中,当您将属性设为可观察时,它会变成函数包装,因此当您需要获取实际值时,您需要将其作为函数访问。这意味着

router.routes[0]将是未定义的,但router.routes()[0]会正常工作!

你可以试试

var adminRoutes = ko.computed(function () {
        return router.routes().filter(function (r) {
            return r.settings.admin;
        });
    });
于 2013-10-17T03:40:50.007 回答
0

我得到了这个工作,虽然可能没有我想要的那么完美。

我注意到的第一个问题是其他人没有看到的问题。在我的示例中(使用 VS 2013 的 HotTowel 模板 1.1 版中的 druandal 2.0),我注意到用于添加 adminRoutes 的代码在激活方法之前被调用。因此,我的 route.routes 是一个空数组。为了解决这个问题,我切换到只使用从 config.js 映射的路由数组(注意:config.routes 而不是 route.routes):

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

最后,我返回“r.admin”。这是希望使工作更好的部分,因为我在没有“设置”组的情况下向管理路由添加了一个管理属性,请参阅“ admin:true ”:

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

通过这两个更改,菜单项出现了。

于 2014-06-05T18:46:00.243 回答