2012-04-11 66 views
10

我有一個對象,也保存在服務器,我從該對象創建一個骨幹模型。我如何告訴骨幹,模型不是新的

但是,當我保存模型時,它正在執行一個PUT請求,這不是我想要的。如何告知Backbone數據已經存在於服務器中而不進行讀取?

+0

骨幹將更新請求映射到PUT http://documentcloud.github.com/backbone/#Sync,那麼您期望什麼行爲? – nikoshr 2012-04-11 16:41:31

+0

我認爲更新請求已映射到POST,但PUt用於創建新項目。 – archmage 2012-04-11 16:45:16

+0

如果有人想強制POST請求,有[多個替代方案](http://stackoverflow.com/a/41091957/1218980)。 – 2016-12-12 01:43:03

回答

18

骨幹確定模型由checking if an id is set新穎性:

是否新款model.isNew()

先後這種模式被保存到服務器了嗎?如果該模型還沒有id,則認爲它是新的。

當你保存模型,

  • 如果它是新的,一個POST請求將被髮出,
  • ,如果它是一個更新(一個ID已被設置),PUT請求將發送

Backbone Sync documentation


以及由@JayC在評論中指出:

如果有一個問題,該ID不能從字面上id,您可以使用idAttribute說這是「身份」或重點領域。

+4

請注意,如果存在id無法從字面上成爲'id'的問題,則可以使用idAttribute。 http://documentcloud.github.com/backbone/#Model-idAttribute來說哪個是「身份」或關鍵字段。 – JayC 2012-04-11 17:18:01

+0

問題:我有一個新的模型(沒有ID),但它的前端設置了其他字段。當我保存模型時,它發送一個PUT請求。它不應該發送POST請求,因爲沒有ID? – archmage 2012-04-11 21:49:54

+2

@archmage奇怪的是,它應該是一個POST。檢查這個小提琴http://jsfiddle.net/jq98Z/,它重現了預期的行爲。也許你會覆蓋默認同步或某個地方的動作映射? – nikoshr 2012-04-12 08:00:48

-1

在這裏添加我的兩分錢,希望它可以避免我必須做的一些頭髮拉動。

直接通過構造函數設置一個模型的id屬性設置爲false或空不會做的伎倆,你必須真正從通過通過內存中刪除刪除

比如,我剛剛掙扎着從一個模型複製屬性鍵入另一種類型作爲新模型:

copy = Trip.clone() 
#doesn't unset the id attribute 
schedule = new models.Schedule(_.extend(copy.attributes, {id:null, trip_id:id}) 
#does unset the id attribute 
delete schedule.id 
schedule.save null, success: => 
    # back from POST vs PUT 
    ...