2013-03-04 67 views
7

我用在我的模型组合键,并根据我的组合键生成ID:骨干做,而不是在更新PUT POST当复合键用于

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

但骨干仍然认为所有实例Assignment是新的,所有虽然我从API中获取它们时在parse方法中设置了id。因此,Backbone不会执行删除操作,并在更新时执行POST而不是PUT操作。我该如何解决这个问题?或者什么是“正确的方法”来做到这一点?

更新:

看起来像this.id更换resp.id解决了这个问题。

+1

Backbone不支持组合键,因此将'idAttribute'定义为数组无效。每个模型必须有一个ID字段。你的资源网址是什么样的? – jevakallio 2013-03-04 11:23:00

+0

它确实支持复合键:https://github.com/documentcloud/backbone/pull/1558其实我通过这样做解决了它.id = ...而不是resp.ide = ... – 2013-03-04 13:37:31

+5

啊,你使用https://github.com/caseywebdev/backbone-composite-keys。在问题中提到它会有道理。 – jevakallio 2013-03-04 13:53:46

回答

2

一个Backbone.Model的parse方法的结果被传递给set方法,该方法设置属性模型的。我认为你的困惑之处在于模型的ID不是它的一个属性;它的属性之一。

那么,什么情况是这样的:

  1. 原始数据从服务器回来并经过parse
  2. 这相同的原始数据,现在增加了一个id属性,传递给set
  3. set的长相和您的idAttribute[ 'personId', 'jobId' ])和所有的原始数据的关键
  4. 由于没有这些键的匹配idAttribute,正其中之一被用作模型的ID,因此你得到了你的问题。

你设置this.idparse作品的解决方案,但因为解析通常被设计为它的输入(原始数据)进行操作,不修改模型本身就可能导致问题的道路;该部分应该在调用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; 
    } 
} 
0
从这里 idAttribute问题

除此之外,你可以随时力骨干通过传递给save()的类型选项使用某种HTTP方法。

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

0

我从来没有与骨干复合ID工作,但我认为这可能是一个简单的答案,您的问题:

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

有了这个代码在你骨干模型定义你为每个模型创建一个唯一的ID,并且您不应该有更新和保存问题(并且您不需要设置任何idAttribute)。