Backbone为自定义id属性提供undefined

时间:2015-04-20 13:02:22

标签: javascript backbone.js

我的数据库中有一个由id和version组成的复合键。我对同一记录的不同版本使用相同的id。 Backbone正在将模型与相同的ID合并,因为它们具有相同的ID。所以看了一下之后,我修改了模型的解析函数。

parse: function(response, options) {
  response.id = response.id + '_' + response.version;
  return response;
}

这非常简单,一切正常,我可以显示具有相同ID和不同版本的多个记录。当我尝试保存模型时,奇怪的行为就开始了。在我的视图中,我有一个saveClickHandler,它将模型发送到后端进行存储。

onSaveClick: function(e){
  // Some form validation which is not very relevant I think
  var self = this,
  data = {
    enabled:      Input.isChecked('enabled', this.$el)? true: false,
    days:         Input.get('days', this.$el),
    from_name:    Input.get('from_name', this.$el),
    reply_to:     Input.get('reply_to', this.$el),
    subject:      Input.get('subject', this.$el),
    content_html: Input.get('message', this.$el),
    postmark_tag: Input.get('postmark_tag', this.$el)
  };

  this.model.save(data, {
    url: Application.Config.URL_API + '/emails/' + self.model.get('id').split('_')[0] + '/' + self.model.get('id').split('_')[1],
  });
}

第一次加载页面并存储记录后,一切顺利,记录在数据库中更新。但是第二次请求失败,因为id未定义。

实际上甚至在进行保存之前,我记录了视图的模型,并且正在从例如10_1到undefined_undefined。我没有明确地修改模型本身,所以我认为它与骨干以某种方式修改它有关。

有人知道我遇到的问题是什么吗?

2 个答案:

答案 0 :(得分:1)

在尝试了更多的东西之后,似乎当我向特定记录提交更新时,我收到了这样的回复:

{"success":true,"code":204,"message":"ok","result":null}

所以我想让我们看看我实施的解析()是否会让事情变得混乱。所以我把我的解析改为:

parse: function(response, options) {
    if (response.id){
        response.id = response.id + '_' + response.version;
        return response;
    }
}

经过测试,一切似乎都运转正常。所以我想由于结果为null,因此找不到ID,因此undefined_undefined。实际上,这一切都非常有意义。

感谢你们两位回复,希望这可以为将来的某些人节省一些时间。

答案 1 :(得分:0)

我想也许你的架构在这里是次优的。更改模型的ID是一个问题的解决方案,通过设计您的app和api来处理版本差异,可以更好地解决这个问题。此外,您还错过了Backbone的配置约定哲学的好处。

一个资源端点访问的每个数据库记录一个模型和一个id应该是目标。这可以通过几种方式解决。

除了当前值之外,让API返回包含版本历史记录的模型:

// GET /model response

{
  "id",
  "foo" : "foo",
  "bar" : "bar",
  "versions" : [
    {
      "version_id" : 1,
      "foo" : "foo1",
      "bar" : "bar1"
    },
    {
      "version_id" : 2,
      "foo" : "foo2",
      "bar" : "bar2"
    }
  ]
}

谢天谢地,您仍然可以在保留版本历史记录的同时收听有关模型属性当前值的更改事件。

另一种可能更合适的解决方法是使用集合并让API为每个版本返回一个单独的模型。这对于API来说也是一种更简洁的REST方法,因为模型及其版本都有自己的端点,例如: / model / version和Backbone的所有内置CRUD操作都可以正常运行,而无需覆盖任何内容。