Backbone Model是一个函数?

时间:2015-07-10 14:00:54

标签: backbone.js reactjs

我有以下功能,在调用时失败:

getAll: function() {
    return _todos.toJSON();
}

_todos.toJSON is not a function它告诉我。

打印_todos由于某种原因function child()给我一个功能 为什么会这样?

这是我的Backbone.Model

var _todos = Backbone.Model.extend();

getAll()功能位于Collection

var TodoCollection = Backbone.Collection.extend({
    model: _todos,
    getAll: ...
});

修改

我实际上是将Backbone与React连接起来,这可能会改变我的工作方式。

除了getAll我还有:

areAllComplete: function() {
    return _.every(this.pluck('complete'), true);
 }

我一直关注的example似乎将getAllareAllComplete放在Model中,根本不使用Collection。我无法理解它,因为我想让它在路上保持平静,我添加了Collection并移动了getAll和其中的一个。

也许,这不是我想要的。

编辑2:

根据警告,getAll的输出预计为Object而不是array。我应该将这些功能添加到Model而不是Collection。需要考虑更多。

我认为这变成了另一个问题......

2 个答案:

答案 0 :(得分:2)

集合model属性用于指定集合包含的模型类,并在将原始数据传递到集合时用于创建正确的模型。另外,根据你的代码,如果它确实有效,你将拥有一个只有一个模型的集合。

除此之外,为了获取您馆藏中所有模型的 JSON ,您可以将其称为toJSON方法

例如todoCollection.toJSON();

或者,如果您特别想在getAll函数中使用它(可能您希望在返回数据之前执行其他操作),则可以执行以下操作

var TodoCollection = Backbone.Collection.extend({
    model: Todo,
    getAll: function () {
      //do something
      return this.toJSON();
    }
});

//here we are passing in the data directly, but you might get it with a fetch call
var todoStore = new TodoCollection(models); 
var todosJson = todoStore.getAll();

另一点需要注意的是,主干命名convention是将PascalCase用于,将camelCase用于实例。

答案 1 :(得分:2)

那是因为Backbone.Model.extend返回构造函数。当您通过model属性将其传递给集合时,您只需让集合知道应该保留哪种模型。

要获取整个集合的JSON,请在集合实例上调用toJSON()

var collection = new TodosCollection();
// add models
collection.toJSON();

如果您想要一个特定模型的JSON,那么通过集合API(atfindWhereget等)获取对它的引用,并在其上调用toJSON()参考

var model = collection.at(0);
model.toJSON();