1

这些天我一直在努力学习backbone.js。我拥有的是一个模型和一个集合。该模型中定义了一些我想在集合中获取的默认属性。这是我的代码:

var model = Backbone.Model.extend({
    defaults : {
        done : true
    }
});

var collection = Backbone.Collection.extend({
    model : model,  

    pickMe : function () {
        log(this.model.get('done')); //return undefined
    }   
});

var col = new collection();
col.pickMe();

如何从集合中调用模型中定义的方法?我在这里做错了吗?

4

3 回答 3

2

@erturne 是正确的,您正在尝试在模型构造函数上调用方法,而不是模型实例。那没有意义。

如果您真的想在集合上定义方法,那么 @drinchev 提供了一个示例,说明如何遍历集合中的模型并调用它们的方法。虽然,这个例子相当笨拙——使用内置的迭代器方法会更优雅。

根据您要完成的工作,您可能只想使用内置的集合迭代器方法来调用每个模型上的方法,而不是在集合上定义方法。例如:

var Model = Backbone.Model.extend({
    defaults : {
      done : true
    }
});

var Collection = Backbone.Collection.extend({
    model : Model
});

var col = new Collection([{}, {done : false}, {}]);

col.each(function (model) {
  log(model.get('done'));
});
于 2012-05-02T12:48:17.873 回答
2

Backbone 的基本设置是这样的:

您有模型是集合的一部分。因此,在您的设置中,您有一个模型构造函数model和集合构造函数collection,但您的集合中没有模型,如果您有任何模型,它们将是一个数组,所以您的代码应该是这样的

var model = Backbone.Model.extend({
    defaults : {
        done : true
    }
});

var collection = Backbone.Collection.extend({
    model : model,  

    pickMe : function () {
        for ( i = 0; i < this.models.length; i++ ) {
            log(this.models[i].get('done')); // this prints 'true'
        }
    }   
});

// Here we are actually creating a new model for the collection
var col = new collection([{ name : 'jack' }]); 

col.pickMe();

您可以在这里检查工作的 jsFiddle:http: //jsfiddle.net/S8tHk/1/

于 2012-05-02T08:56:44.847 回答
0

我认为您最好将模型方法附加到模型本身,而不是集合中。所以你应该有这样的东西:

var model = Backbone.Model.extend({
    defaults : {
        done : true
    },
    pickMe : function () {
        log(this.get('done'));
    }
});

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


var model = collection.get(id)
model.pickMe()
于 2012-05-02T10:05:19.313 回答