2013-03-04 68 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)。