2011-09-12 45 views
17

抓取單個骨幹的模型說我有一個路由設置:從服務器

'photos/:id' : 'showPhoto' 

,有人分享的網址:www.mysite.com/photos/12345與一個朋友。

當他們的朋友點擊共享鏈接時,showPhoto被12345以ID身份傳回。我無法弄清楚如何從服務器獲取的模式,因爲設置它的id屬性和調用取(),即使骨幹認爲,該模型isNew等Ajax請求的URL只是/photos,而不是/photos/12345

showPhoto: (id) -> 
    photo = new models.Photo _id:id 
    photo.fetch #does a GET to /photos, I would have expected it to request /photos/12345 
    success:() -> 
     render photo view etc... 

Photo = Backbone.Model.extend 
    idAttribute: '_id' 
    urlRoot: '/photos' 

模型Photo通常是一個集合的一部分,但在這種情況下有人直接訪問該網站,只希望看到一張照片的數據,所以集合在應用程序的這種狀態下不會被實例化。

是加載整個照片集合然後使用collection.getById(id)的解決方案嗎?當我只想加載一個模型的屬性時,這看起來太低效了。

回答

25

如果您沒有將該模型作爲集合的一部分,則必須手動告知模型完整的url。它不會將id自動附加到您指定的urlRoot。你可以指定一個函數作爲urlRoot做到這一點:

Photo = Backbone.Model.extend({ 
    urlRoot: function(){ 
    if (this.isNew()){ 
     return "/photos"; 
    } else { 
     return "/photos/" + this.id; 
    } 
    } 
}); 

骨幹網採用典型的id,以確定是否是新的或沒有,所以一旦你設置的是,該代碼應能正常工作。如果沒有,你可以隨時在if語句中檢查id而不是檢查isNew。

+0

Derick,你是怎麼來學習這麼多關於Backbone的?我還沒有找到任何明確的指南。我閱讀了Addy Osmani的骨幹基礎和食譜,以及無數的博客,包括你的博客。你似乎比大多數人有更深的理解。你從哪裏拿起來的? – AndrewHenderson

+10

試驗和錯誤,閱讀Backbone源代碼,閱讀我所能做的一切,儘可能多地學習JavaScript ......但主要是試圖教其他人。教別人強迫你深入挖掘並真正理解發生了什麼。 :) –

+1

這似乎是一個過時的答案,因爲Backbone的API已經改進。我們可以改進這種迴應嗎? – sankargorthi

1

我會引導收集(通過渲染下面的頁面),在它只是一個模型是這樣的:

photos = new PhotoCollection(); 
photos.reset([ @Html.ToJson(Model) ]); 

請注意,我用的是服務器端代碼是ASP.Net MVC所以使用特定於您的服務器端架構的東西。另請注意,方括號非常重要,因爲它們將您的單數模型包裝在一個數組中。

希望有幫助。

3

你做不需要告知骨幹網址是否附加了id。根據文檔:http://backbonejs.org/#Model-fetch,您可以簡單地將urlRoot設置爲集合中url的等效值。

骨幹將所需的ID自動添加到URL,只要你使用以下方法之一:

model.set("id", 5); //After initialized 
model = new Backbone.Model({id: 5}); //New model 

如果手動設置中的id屬性散列或直接在模型上,骨幹贏得」不要意識到這一點。

model.id = 5; //Don't do this!