我一直在将我的应用从RethinkDb迁移到Firebase,并在调用collection.create()时试图让我的集合保存。奇怪的是,我的应用程序中有两个Backbone.Firebase.Collection实例,其中一个能够正确创建新对象。另一个看似相同的集合无法写入数据并且不会生成任何错误消息。
我有两个集合,每个集合都有自己的模型类型: 1)Projects (Collection) - > Project (Model) 2)Projects (Collection) - > Shots (Collection) - > Shot (Model)
以下是上述集合/模型的定义:
/* Projects Collection - An ordered list of Projects */
var ProjectModelFirebase = require('../models/projectModelFirebase.js');
module.exports = Backbone.Firebase.Collection.extend({
model: ProjectModelFirebase,
firebase: new Firebase(app.fbUrl),
initialize: function() {
}
});
/* Project Model - data layer for a single Project */
module.exports = Backbone.Firebase.Model.extend({
firebase: new Firebase(app.fbUrl),
initialize: function() {
}
});
/* Shots Collection - An ordered list of Shots */
var ShotModelFirebase = require('../models/shotModelFirebase.js');
module.exports = Backbone.Collection.extend({
model: ShotModelFirebase,
firebase: new Firebase(app.fbUrl),
initialize: function() {
}
});
/* Shot Model - data layer for a single Shot */
module.exports = Backbone.Firebase.Model.extend({
firebase: new Firebase(app.fbUrl),
initialize: function() {
}
});
在我的项目路径(routes file)中,我正常地将集合绑定到视图,并使用模板中的一些输入调用this.collection.create。我能够以这种方式成功创建项目,它们出现在我的Forge中没有任何问题。我从路线功能中调用视图:
// Display list of latest projects
projectsCollectionFirebase = new ProjectsCollectionFirebase();
var projectsView = new ProjectsView({collection: projectsCollectionFirebase});
在我的项目路线(routes file)中,我将项目集合绑定到视图并通常从Firebase检索项目的信息:
// Display a single project
projectModelFirebase = new ProjectModelFirebase({id: project});
var projectView = new ProjectView({model: projectModelFirebase});
然后我继续(projectView file)创建一个新的镜头集合:
shotsCollectionFirebase = new ShotsCollectionFirebase();
shotsView = new ShotsView({ collection: shotsCollectionFirebase, project: this.model.get('id') });
镜头视图(ShotsView file)呈现模板和输入字段供用户输入镜头。
从这里开始,当用户点击“保存”按钮时,我会调用this.collection.create。 Backbone会识别新模型并相应地更新视图,但Firebase不会对其进行操作。控制台中有一条错误消息,指出“在Firebase模型上保存调用,忽略”。但我没有在我的代码中明确提出任何保存。
我尝试打开调试并注意到'projects'create命令导致此消息:
r:0: update {"path":"/projects/test","value":{"shots":null}}
而'shot'集合并不会触发'更新'事件。
文件几乎相同。我能发现的唯一区别是第一个示例一次只加载一个集合,而第二个示例加载一个集合,抓取数据,然后加载另一个集合。
任何帮助都将不胜感激。
您可以在我的仓库中找到项目的完整代码:https://github.com/bdickason/shots/tree/firebase
答案 0 :(得分:2)
Backfire有两种操作模式,一种是模型/集合,其中包含“Firebase”,例如:Backbone.Firebase.Model / Backbone.Firebase.Collection;以及使用常规骨干集合和模型的另一种模式,但在其上定义了“firebase”属性,覆盖了主干sync()
方法。
不应混合和匹配这两种模式。例如,如果您使用Backbone.Firebase.Collection
,则只要对任何模型进行更改,该集合中的所有模型都将自动与服务器同步(Backbone.Firebase.Model
相同)。调用save
或sync
不会执行任何操作,因为更改会在发生时实时保存和同步。
有时这不是您在应用中所需的内容,例如,您希望用户在将任何内容保存到Firebase之前明确点击保存按钮。在这些情况下,最好使用常规的Backbone集合或模型,并简单地在它们上提供firebase
属性。然后,您需要明确地致电sync
或save
,以便将本地模型/集合上的任何更改添加到Firebase中。