我看到使用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的对象,并且创建会失败,因为没有设置网址(如预期的那样)。
提前感谢澄清!
答案 0 :(得分:1)
Push不是Backfire API覆盖的功能的一部分。它几乎与Backbone.Collection签订了相同的合同。因此,push
只是将一条记录附加到数组的末尾,而不将其同步到任何后端。
您可以通过在sync
之后调用push
来创建所需的行为,正如通常使用Backbone集合所做的那样。我不确定id在这里是如何工作的,你可能需要在对象上添加一个才能进行同步。
但是,使用create / add可能是最简单的,它是BackFire API的一部分并处理服务器同步。