我有以下功能,在调用时失败:
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似乎将getAll
和areAllComplete
放在Model
中,根本不使用Collection
。我无法理解它,因为我想让它在路上保持平静,我添加了Collection
并移动了getAll
和其中的一个。
也许,这不是我想要的。
编辑2:
根据警告,getAll
的输出预计为Object
而不是array
。我应该将这些功能添加到Model
而不是Collection
。需要考虑更多。
我认为这变成了另一个问题......
答案 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(at
,findWhere
,get
等)获取对它的引用,并在其上调用toJSON()
参考
var model = collection.at(0);
model.toJSON();