2014-11-20 66 views
2

我是Backbone和Firebase的新手。我使用的是事与愿违,有一个集合:Firebase Backfire:model.set()未同步到Firebase

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

模型本身是不依赖于火力地堡(是越来越“无效的火力地堡参考建立”错误):

var UserModel = Backbone.Model.extend({ 
    defaults: function() { 
     return { 
      email: "[email protected]" 
     }; 
    } 
}); 

在我看来,我实例收集,和我得到的数据好了,我可以添加新的模式,以收集,如下所示:

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

伟大的作品,新的用户记录出现在火力地堡。然而,假设我现在要抓住给定用户的模型,并更新其数据:

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

这在本地更新模型,但更改的模型没有得到同步到火力地堡。之后我尝试了userRecord.save();,但它触发了“循环引用”错误。每文档,set()应该这样做显然毛刺东西掉:(

+0

所以真正的问题是为什么.save()返回循环引用错误,因为清楚地调用set()不会将更改持久化到Firebase。 – Kato 2014-11-20 18:59:53

+0

调用.set()会在0.4版本中保留对Firebase的更改。我运行了相同的代码,并且能够坚持到Firebase。你用什么作为你的userData变量? – 2014-11-20 21:50:35

+0

使用用户数据是相当简单的,有一层嵌套: '{ “ID”: “-JDFx3e ..”, “电子邮件”: “[email protected]”, “名”: “皮特”, “事件”:{ “-Jxfe ..”:{ “数量”:2 }, “-JzDa ..”:{ “数量”:1 } } }' 添加()收集工作正常。但是当我尝试在提取的模型上设置()时,例如userRecord.set({events:events}),该操作在本地模型上工作,但不会“持久”到我的Firebase。是一个标准的Backbone模型在这里好吗,还是我需要'Backbone.Firebase.Model.extend()' - 有点不确定何时使用它。 – pete 2014-11-21 00:35:40

回答

3

userRecord变回来为未定义在这种情况下,因为allUsers集合没有被填充数据呢。该数据仍然被下载到火力地堡当你调用.findWhere()

为了避免这种情况,你可以听sync事件,做你的所有行动从那里。

JSBin example

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

在处理任何操作之前,您需要确保您的集合已填充。推荐使用sync事件。

+0

感谢您使用'sync'提示。但是,在其上运行'set()'时,它肯定有一个有效的'userRecord'模型。我更新了你的[JSBin](http://jsbin.com/livuwe/2/edit)来尝试复制;特别是我试图用嵌套对象更新模型的'events'属性。它似乎在这里持续存在,尽管内部密钥回到了未定义的位置? – pete 2014-11-22 05:39:33

+0

这和以前一样。当你更新userRecord时,它是一个异步操作。你必须听取'change'方法来确保数据已经返回。我已经更新了答案和小提琴。 – 2014-11-22 19:18:46

+0

在我的应用中对嵌套数据执行一组操作对我来说是一个不同的问题(尚未回到它,可能与此时的结构有关),但此答案在别处证明非常有用 - 谢谢! – pete 2014-12-01 13:46:35