从Backbone集合创建对象,将模型值相互映射

时间:2015-02-04 19:11:33

标签: javascript backbone.js underscore.js backgrid

我们正在使用Backgrid,它允许您使用Javascript对象数组定义网格列,并将其转换为集合。我们正在尝试利用此功能逐列进行可配置验证,因此我们可能会在以下情况下添加"验证器"功能到几个列:

[
    {
        label: "Delete",
        name: "delete",
        cell: "boolean"
    },
    {
        label: "Alias",
        name: "alias",
        cell: "string",
        sortType: "toggle",
        validator: function (value) {
            return true;
        }
    },
    {
        label: "Assigned Server",
        name: "assignedServer",
        cell: "string",
        sortType: "toggle",
        validator: function (value) {
            return new Error("Cannot Assign Server")
        }
    }
]

我们正在按照以下规定的方式收听对网格的编辑,出于这个问题的目的,我们可以忽略函数的模型参数,但专注于列(deletealias或来自上面的assignedServer,它本身就是一个集合中的模型。到目前为止,我有一段代码,利用了underscore.js _.filter返回validatableColumns,但我希望进一步采用格式{name: validator, etc...}格式的对象。考虑到我的具体用例,从Backbone集合中创建一个将模型值相互映射的对象的简洁方法是什么?

certificateGrid.listenTo(certificateCollection, "backgrid:edited", function (model, column) {                    
    var validatableColumns = _.filter(column.collection.models, function (c) {
        return c.get('validator');
    });

    //etc.

1 个答案:

答案 0 :(得分:0)

使用_.reduce似乎可以解决问题:

var validatorFns = _.reduce(column.collection.models, function (fns, model) {
    var validator = model.get('validator');
    if (model.get('validator')) {
        fns[model.get('name')] = validator;
    }
    return fns;
}, {});