2

我发现在使用 Backfire 的集合上使用 create() 和 push() 有所不同,我想知道这是我的误解还是错误。

我有一个动物模型和动物集合,如下所示。通常,该集合是使用包含 zoo_id 的选项对象创建的,然后用于在新模型中填充 zoo_id。对于此示例,这是一个固定值。

var Animal = Backbone.Model.extend({
      initialize: function(attributes, options) {
        console.log("model initializing", attributes, options)
      }
    }),
    Animals = Backbone.Firebase.Collection.extend({
      firebase: myFirebaseUrl + "/animal",
      initialize: function(models, options) {
        this.model = function(attrs, opts) {
          return new Animal(_.extend(attrs, {zoo_id: 4}))
        };
        this.on("add", function(model, collection, options) {
          console.log("adding", model, collection, options, model.attributes)
        })
      }
    })
var a= new Animals()

如果 Firebase 中有数据,则 a[] 中检索到的所有动物模型的 zoo_id = 4,正如预期的那样。

当我新模型时

a.push({name: "racoon"})

所有记录到控制台的属性对象都有 zoo_id = 4。但是,返回的对象没有 zoo_id,Forge 中的新条目也不存在 zoo_id。

当我创建一个新模型时

a.create({name: "ape"})

记录到控制台的所有属性对象都具有 zoo_id = 4,返回的对象具有 zoo_id = 4,并且具有 zoo_id = 4 的新条目在 Forge 中。

如果我删除 Firebase 扩展并以相同的方式使用常规 Backbone 模型和集合,则push返回一个带有 zoo_id 的对象,并且由于没有设置 url(如预期的那样)而创建失败。

提前感谢您的澄清!

4

1 回答 1

1

推送不是 Backfire API 覆盖的功能的一部分。它几乎遵循与 Backbone.Collection 相同的合同。因此,push只需将记录附加到数组的末尾,而不会将其同步到任何后端。

您可能可以通过调用syncafter来创建所需的行为push,就像通常使用 Backbone 集合所做的那样。我不确定 id 在这里如何工作,您可能需要在对象上添加一个才能同步它。

然而,使用 create/add 可能是最简单的,它们是 BackFire 的 API 的一部分并处理服务器同步。

于 2014-07-25T18:32:15.103 回答