0

我一直在将我的应用程序从 RethinkDb 迁移到 Firebase,并且在调用 collection.create() 时遇到了试图保存我的收藏的墙。奇怪的是,我的应用程序中有两个 Backbone.Firebase.Collection 实例,其中一个能够正确创建新对象。另一个看似相同的集合无法写入数据并且不会生成错误消息。

我有两个集合,每个集合都有自己的模型类型:1)项目(集合) ->项目(模型) 2)项目(集合) ->镜头(集合) ->镜头(模型)

以下是上述集合/模型的定义:

/* 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() {
    }
});

在我的 Projects 路由(路由文件)中,我通常将集合绑定到视图,并使用模板中的一些输入调用 this.collection.create。我能够以这种方式成功创建项目,并且它们毫无问题地出现在我的 Forge 中。我从我的路由函数调用视图:

// Display list of latest projects
    projectsCollectionFirebase = new ProjectsCollectionFirebase();
    var projectsView = new ProjectsView({collection: projectsCollectionFirebase});

在我的项目路由(路由文件)中,我将项目集合绑定到视图并正常从 Firebase 检索项目信息:

// Display a single project
    projectModelFirebase = new ProjectModelFirebase({id: project});
    var projectView = new ProjectView({model: projectModelFirebase});

然后我继续(projectView 文件)创建一个新的镜头集合:

shotsCollectionFirebase = new ShotsCollectionFirebase();
shotsView = new ShotsView({ collection: shotsCollectionFirebase, project: this.model.get('id') });

镜头视图(ShotsView 文件)呈现模板和输入字段供用户输入镜头。

从这里,当用户单击“保存”按钮时,我调用 this.collection.create。Backbone 会识别新模型并相应地更新视图,但 Firebase 不会对其采取行动。控制台中有一条错误消息,指出“在 Firebase 模型上调用保存,忽略。” 但我的代码中没有明确调用任何保存。

我尝试打开调试并注意到“项目”创建命令会导致此消息:

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

而“镜头”集合不会触发“更新”事件。

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

任何帮助,将不胜感激。

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

4

1 回答 1

2

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

这两种模式不应该混搭。例如,如果您使用 a Backbone.Firebase.Collection,则该集合中的所有模型将在任何时候对任何模型进行更改时自动与服务器同步(对于 也是如此Backbone.Firebase.Model)。调用save, orsync不执行任何操作,因为更改会在发生时实时保存和同步。

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

于 2014-02-11T00:05:23.817 回答