2014-08-28 50 views
0

m是Backbone.Model的子類。我希望m.url()返回 '/ API /媒體/來源/ 1',而是我得到:在骨幹中獲取單個模型,爲什麼這不起作用?

> m.id 
1 
> m.collection.url 
"/api/media/sources" 
> m.urlRoot 
undefined 
> m.url() 
"/api/media/sources" 

這是怎麼回事?

+0

你可以顯示你的模型的'idAttribute'和調用'isNew()'的結果嗎? – 2014-08-28 21:00:38

回答

1

如果要將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小時前

+0

啊,collection.url應該和urlRoot一樣工作,但是這段代碼顯示了真正的問題:如果isNew()返回true,則不會追加id。即使設置了m.id,m.attributes.id也沒有,事實證明你需要設置兩者。 – elplatt 2014-08-28 21:11:20

+0

啊,是的。一般來說,對於所有屬性更改,您應該始終使用'model.set(「id」,idValue)',甚至尤其是ID屬性。 (如果你已經在模型原型上設置了'idAttribute'作爲第一個參數,而不是''id「'。) – 2014-08-29 02:38:31

+0

通常,直接訪問'model.attributes'是個壞主意 - 改爲使用'model.set()'和'model.get()'。 'model.id'屬性是一個方便的東西,你應該基本上把它看作是隻讀的; Backbone會在涉及id屬性的每個'set()'調用中適當地修改它。 – 2014-08-29 02:41:37