7

我在我的模型中使用复合键并根据我的复合键生成 ID:

app.Assignment = Backbone.Model.extend({
    idAttribute : [ 'personId', 'jobId' ],
    parse : function(resp) {
        resp.id = resp.personId + "_" + resp.jobId;
        return resp;
    }
});

但是Backbone 仍然认为所有Assignment 实例都是新的,尽管我在从API 获取它们时在parse 方法中设置了id。因此,Backbone 不执行 DELETE,而是在更新时执行 POST 而不是 PUT。我该如何解决这个问题或“正确的方法”是什么?

更新:

看起来用 this.id 替换 resp.id 可以解决问题。

4

3 回答 3

2

Backbone.Model的方法的结果parse被传递给set设置模型属性的方法。我认为你的困惑点是模型的 ID 不是它的属性之一。这是它的属性之一。

所以,发生的事情是这样的:

  1. 您的原始数据从服务器返回并传递给parse
  2. 同样的原始数据,现在增加了一个id属性,被传递给set
  3. set看起来和你的idAttribute( [ 'personId', 'jobId' ]) 以及原始数据中的所有键
  4. 由于这些键都不匹配idAttribute,因此它们都不会用作模型的 ID,因此您会遇到问题。

您设置this.id内部的解决方案parse有效,但它可能会导致问题,因为 parse 通常设计为对其输入(原始数据)进行操作,而不是修改模型本身;这部分应该在set被调用时发生。相反,更清洁的解决方案是执行以下操作:

app.Assignment = Backbone.Model.extend({
    // note that no idAttribute is specified, leaving it as the default "id"
    parse : function(resp) {
        resp.id = resp.personId + "_" + resp.jobId;
        return resp;
    }
}

或者,如果您想要不同的 ID 属性...

app.Assignment = Backbone.Model.extend({
    idAttribute: 'personAndJobId',
    parse : function(resp) {
        resp.personAndJobId = resp.personId + "_" + resp.jobId;
        return resp;
    }
}
于 2014-09-27T04:35:32.260 回答
1

除了idAttribute这里的问题,你总是可以通过传递给的类型选项强制 Backbone 使用某种 HTTP 方法save()

model.save(null, { type: 'put' })

于 2015-12-29T19:38:56.700 回答
0

我从未在 Backbone 中使用复合 ID,但我认为这可能是您问题的简单答案:

initialize: function() {
      this.set("id", this.generateID());
},
generateID = function () {
    return this.personId + + "_" + this.jobId;
}

使用 Backbone 模型定义中的此代码,您将为每个模型创建一个唯一 ID,并且更新和保存它不应该有问题(并且您不需要设置任何 idAttribute)。

于 2016-02-26T13:24:20.920 回答