在骨干模型中定义公共方法

时间:2012-07-23 19:10:24

标签: javascript backbone.js backbone-relational

我需要遍历骨干集合并获取从集合中的模型派生的对象数组。

问题是我不知道如何让集合访问在以下对象中创建模型定义时定义的方法:Backbone.Model.extend({})

这是我到目前为止的架构示例:

// THE MODEL
var TheModel = Backbone.Model.extend({
    // THE FOLLOWING IS NOT AVAILABLE AS A METHOD OF THE MODEL:
    //     This isn't the actual method, but I though it might be helpful to
    //     to demonstrate that kind of thing the method needs to do (manipulate:
    //     map data and make it available to an external library)
    get_derived_object: function(){
        return this.get('lat') + '_' this.get('lon');
    }

});

// THE COLLECTION:
var TheCollection = Backbone.Collection.extend({
    // Use the underscore library to iterate through the list of
    //     models in the collection and get a list the objects returned from
    //     the "get_derived_object()" method of each model:
    get_list_of_derived_model_data: function(){
        return _.map(
            this.models,
            function(theModel){
                // This method is undefined here, but this is where I would expect
                //     it to be:
                return theModel.get_derived_object();

            }
        );
    }

});

我不确定我在哪里出错,但我有一些猜测:  *该集合不是以它应该的方式迭代它的模型  *无法在Backbone.Model.extend({})中定义公共方法  *我正在寻找公共方法的错误位置  *一些其他架构错误源于对Backbone.js如何使用的误解

非常感谢任何帮助,非常感谢!

修改

问题在于此代码中确实存在错误。当集合被填充时,它没有引用“TheModel”作为其模型类型,因此它创建了自己的模型。

定义集合时需要添加以下代码:model: TheModel

var theCollection = Backbone.Collection.extend({
    model: TheModel,
    ...
});

1 个答案:

答案 0 :(得分:2)

而不是使用:

return _.map(
    this.models,
    function(theModel){
        // This method is undefined here, but this is where I would expect
        //     it to be:
        return theModel.get_derived_object();
     }
);

为什么不使用内置集合版本:

return this.map(function(theModel){
    return theModel.get_derived_object();
});

不确定这是否会有所帮助,但值得一试。

对于记录,new Backbone.Model(的第一个参数中定义的所有方法都是“公共”,因此您已经掌握了基础知识。