Firebase Backfire:model.set()不会同步到Firebase

时间:2014-11-20 17:09:31

标签: javascript firebase backfire backbonefire

我是Backbone和Firebase的新手。我正在使用Backfire,有一个集合:

var UsersCollection = Backbone.Firebase.Collection.extend({
    model: UserModel,
    firebase: new Firebase( "https://xxxxxx.firebaseio.com/users" ),
});

模型本身与Firebase无关(正在创建“无效的Firebase参考创建”错误):

var UserModel = Backbone.Model.extend({
    defaults: function() {
        return {
            email: "example@example.com"
        };
    }
});

在我的视图中,我实例化了该集合,并且我得到了数据,我可以将新模型添加到集合中,如下所示:

this.allUsers  = new UsersCollection();
...
this.allUsers.add( userData );

效果很好,Firebase上会显示新的用户记录。但是,假设我现在想要获取给定用户的模型并更新其数据:

var userRecord = this.allUsers.findWhere( {email: email} );
userRecord.set( {age: age} );

这会在本地更新模型,但更改的模型不会同步到Firebase。之后我尝试了userRecord.save();,但它触发了“循环引用”错误。根据文档,set()应该明确表示某些内容已关闭:(

1 个答案:

答案 0 :(得分:3)

在这种情况下,userRecord变量返回为未定义,因为allUsers集合尚未填充数据。当您拨打.findWhere()时,数据仍会下载到Firebase。

为避免这种情况,您可以收听sync事件并从那里执行所有操作。

JSBin example

allUsers.on('sync', function(collection) {
  // collection is allUsers
  var userRecord = collection.findWhere( {email: 'david@email.com'} );
  userRecord.on('change', function(model) {
     console.log('changed', model);
  });
  userRecord.set( {age:4} );
});

在处理对它们的任何操作之前,您需要确保填充集合。建议使用sync事件来执行此操作。