Firebase + backbone:collection.create()和collection.push()之间的区别?

时间:2014-07-21 00:16:46

标签: javascript firebase backfire

我看到使用Backfire对集合使用create()和push()有所不同,并想知道这是否是我的误解或错误。

我有一个动物模型和动物集合如下。通常,使用包含zoo_id的options对象创建集合,然后使用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中有数据,那么[]中检索到的所有动物模型都会像预期的那样拥有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模型和集合,推送会返回一个带有zoo_id的对象,并且创建会失败,因为没有设置网址(如预期的那样)。

提前感谢澄清!

1 个答案:

答案 0 :(得分:1)

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

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

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