Backbone模型是一个函数?

Backbone Model is a function?

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

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。我无法理解它,因为我希望它成为 restful,我添加了 Collection 并移动了 getAll 和其中的另一个。

也许,这不是我想要的。

编辑 2:

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

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

collection model 属性 用于指定 class collection 包含的模型,并用于在您通过时创建适当的模型原始数据到您的 collection。此外,根据您的代码,如果它确实有效,您将拥有一个只有一个模型的 collection。

除此之外,为了获得 collection 中所有模型的 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();

另一件需要注意的事情是 backbone 命名 conventionclasses 使用 PascalCase 并且实例使用 camelCase .

那是因为Backbone.Model.extend returns一个构造函数。当您通过 model 属性 将其传递给集合时,您只是让集合知道它应该包含哪种模型。

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

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

如果您想要 JSON 用于某个特定型号,请通过集合 API 获取对它的引用(atfindWhereget 等) 并对该引用调用 toJSON()

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