m是Backbone.Model的子類。我希望m.url()返回 '/ API /媒體/來源/ 1',而是我得到:在骨幹中獲取單個模型,爲什麼這不起作用?
> m.id
1
> m.collection.url
"/api/media/sources"
> m.urlRoot
undefined
> m.url()
"/api/media/sources"
這是怎麼回事?
m是Backbone.Model的子類。我希望m.url()返回 '/ API /媒體/來源/ 1',而是我得到:在骨幹中獲取單個模型,爲什麼這不起作用?
> m.id
1
> m.collection.url
"/api/media/sources"
> m.urlRoot
undefined
> m.url()
"/api/media/sources"
這是怎麼回事?
如果要將id
附加到URL上,應該設置爲urlRoot
而不是url
。
看看的default implementation for Backbone.Model.prototype.url
,它纔有意義:
url: function() {
var base =
_.result(this, 'urlRoot') ||
_.result(this.collection, 'url') ||
urlError();
if (this.isNew()) return base;
return base.replace(/([^\/])$/, '$1/') + encodeURIComponent(this.id);
},
透露稍後評論(這個答案被張貼後),這個問題曾與屬性是如何被設置的事情。
一般而言,您應該始終使用model.set("id", idValue)
來處理所有屬性更改,尤其是ID屬性。 (如果您已設置idAttribute
對模型樣機別的東西,用該名稱作爲第一個參數,而不是"id"
)
更普遍的是,這是一個壞主意來訪問model.attributes
使用兩個直和model.set()
而是model.get()
。 model.id
屬性是一種便利,您應該基本上將其視爲只讀;骨幹將在涉及id屬性的每個set()
調用中適當地修改它。 - 白金Azure 18小時前
啊,collection.url應該和urlRoot一樣工作,但是這段代碼顯示了真正的問題:如果isNew()返回true,則不會追加id。即使設置了m.id,m.attributes.id也沒有,事實證明你需要設置兩者。 – elplatt 2014-08-28 21:11:20
啊,是的。一般來說,對於所有屬性更改,您應該始終使用'model.set(「id」,idValue)',甚至尤其是ID屬性。 (如果你已經在模型原型上設置了'idAttribute'作爲第一個參數,而不是''id「'。) – 2014-08-29 02:38:31
通常,直接訪問'model.attributes'是個壞主意 - 改爲使用'model.set()'和'model.get()'。 'model.id'屬性是一個方便的東西,你應該基本上把它看作是隻讀的; Backbone會在涉及id屬性的每個'set()'調用中適當地修改它。 – 2014-08-29 02:41:37
你可以顯示你的模型的'idAttribute'和調用'isNew()'的結果嗎? – 2014-08-28 21:00:38