【问题标题】:Backbone JS Save/Delete to Server Keep Primary Keys Associated with Models?Backbone JS 保存/删除到服务器保持与模型关联的主键?
【发布时间】:2011-04-30 18:22:09
【问题描述】:

好吧,假设我有一个带有 Person 表的数据库。它有以下字段。

Id (PK, auto-increment) Name (string) Age (int)

我可以获取服务器以获取人员列表,当我渲染主干视图时,它会在模型​​中包含它们的关联 ID。太好了。

现在假设我有一个添加功能来添加一个新的人。我可能有 2 个文本框(一个用于姓名,一个用于年龄)和一个保存按钮。

当我点击保存时,我可以使用来自 Backbone 的人员集合并将该记录添加到集合中,它还将处理(POST 到 Backbone 集合 URL)向我的服务器发布(姓名、年龄)。

但是我不明白的是,从数据库插入生成的 Id 不再与我刚刚启动的主干模型相关联。

或者是在“添加”之后我需要再次获取以获取新列表的想法?

【问题讨论】:

    标签: database backbone.js


    【解决方案1】:

    根据您的问题,我可能没有足够的信息来回答这个问题,因此我假设您的视图已被赋予集合实例。此外,我假设您的 POST 发布了模型的属性,但会立即返回模型的属性,包括其新分配的 id。

    所以你想做的是:

    1. 将视图绑定到 DOM 事件以触发 Person 保存。
    2. 将视图绑定到集合实例的添加(和/或删除事件)。
    3. 在您的 Person 保存事件处理程序中,获取 person 属性并使用它们初始化一个新的 Person 模型;然后保存它。在您的成功回调中,将生成的模型添加到集合中,该模型现在具有一个 id。
    4. 在您的添加事件处理程序中,根据需要重新渲染视图。

    这里有一些代码:

    PeopleView = Backbone.View.extend({
    
      events: {
          "submit form#person-form" : "onSave",
          "click .remove-person"    : "onRemovePerson",
      },
    
      // Presumes you've handed the view a people collection and
      // named it 'collection' to enable backbone.js to auto set it
      // into the view's state.
      initialize: function(options) {
          _.bindAll(this, "onPersonAdded");
          this.collection.bind("add", this.onPersonAdded);
          this.collection.bind("remove", this.onPersonRemoved);
      },
    
      onSave: function(e) {
          var self = this;
          var person = new Person();
          var person_attrs = this.serialize();  // harvest from your form in this method.
          person.save(person_attrs, {
              success: function(saved_person, data) {
                  self.collection.add(saved_person);
              },
              error: function(aborted_person, response) {
                  // Error handling as needed.
              }
          });
      },
    
      onRemovePerson: function(e) {
          e.preventDefault();
          var cid = $(e.target).attr('id');
          var person = this.collection.getByCid(cid);
          person.destroy({
              success: function(removed_person, data) {
                  self.collection.remove(removed_person);
              },
              error: function(aborted_person, response) {
                  // Error handling as needed.
              }
          });
      },
    
      onPersonAdded: function(added_person) {
          // perform rendering as needed here.
      },
    
      onPersonRemoved: function(removed_person) {
          // perform rendering as needed here.
      }
    
    });
    

    作为一种风格说明,您可能不想在视图中处理模型保存代码。您也可以服从控制者或其他适当的实体。

    【讨论】:

    • 比尔 - 感谢您的回复。似乎您最近对 Backbone 的研究有点过火。不太确定它是否已经让我购买了 MVC JS 框架。虽然我确实喜欢它带来的很多东西。
    • FWIW,我们正在使用backbone.js 构建TripCase(iPhone、Android、Blackberry)应用程序的“触摸”实现。因此,我正在积累一些使用该框架的经验。肯定还在学习。
    • 酷 - 所以想法是将模型发布到服务器,等待回调,这将返回包括新启动的 ID,然后添加到集合中,这将触发视图重新呈现。我认为要使其正常工作,您需要 2 个主干 JS 视图。一个表示人员记录的视图(可能是 UL 中的 li 元素或表中的 tr),然后是处理 Add 和 Add All 的“App View”。你同意吗?
    • 我认为您只需要一个管理集合的视图。您绝对可以将事物分成单独的视图,但这样做时要考虑内存和文件管理问题;换句话说,您可能会选择保持简单。
    • 我已经用你可能用来管理删除的代码更新了代码。它假定您使用 Person 实例的 cid 作为每个 Person 在 DOM 中的唯一标识符。您可以从 DOM 中获取 id,只是它包含 cid。然后您使用内置的backbone.js 方法通过cid 获取人员。此后,你摧毁了这个人。我添加了事件响应器,以使用基于事件的方法让视图在删除发生时更新自身。这种方法意味着视图可以处理不一定通过表单 DOM 事件发生的人员移除。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2016-01-23
    • 2011-09-16
    相关资源
    最近更新 更多