使用“Firebase.Collection”无法在Backbone应用中保存数据

时间:2014-02-10 03:31:35

标签: javascript backbone.js firebase backfire

我一直在将我的应用从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'cre​​ate命令导致此消息:

r:0: update {"path":"/projects/test","value":{"shots":null}}

而'shot'集合并不会触发'更新'事件。

文件几乎相同。我能发现的唯一区别是第一个示例一次只加载一个集合,而第二个示例加载一个集合,抓取数据,然后加载另一个集合。

任何帮助都将不胜感激。

您可以在我的仓库中找到项目的完整代码:https://github.com/bdickason/shots/tree/firebase

1 个答案:

答案 0 :(得分:2)

Backfire有两种操作模式,一种是模型/集合,其中包含“Firebase”,例如:Backbone.Firebase.Model / Backbone.Firebase.Collection;以及使用常规骨干集合和模型的另一种模式,但在其上定义了“firebase”属性,覆盖了主干sync()方法。

不应混合和匹配这两种模式。例如,如果您使用Backbone.Firebase.Collection,则只要对任何模型进行更改,该集合中的所有模型都将自动与服务器同步(Backbone.Firebase.Model相同)。调用savesync不会执行任何操作,因为更改会在发生时实时保存和同步。

有时这不是您在应用中所需的内容,例如,您希望用户在将任何内容保存到Firebase之前明确点击保存按钮。在这些情况下,最好使用常规的Backbone集合或模型,并简单地在它们上提供firebase属性。然后,您需要明确地致电syncsave,以便将本地模型/集合上的任何更改添加到Firebase中。