2011-12-11 210 views
44

我已經使用Backbone.js編寫了模型/視圖/集合。我的集合使用fetch方法從遠程服務器加載模型。這個集合所需的url需要一個id:messages/{id}。但我發現沒有乾淨的方式將選項傳遞給Collection。Backbone.js集合選項

backbone.js視圖通過在構造上傳遞選項來接受選項:view([options]),但集合需要構造時的模型列表:collection([models])。

將參數/選項傳遞給此集合的「最乾淨」方式是什麼?

縮短代碼:

var Messages = Backbone.Collection.extend({ 
model: Message, 
    url: 'http://url/messages/' + id 
}); 
+4

也許使用相對網址是一個更好的主意呢? – malletjo

回答

107

@保羅的回答是不錯的,但它也是值得注意的是,url屬性可以是一個函數。在我看來(這只是意見,因爲最終結果是一樣的),如果更詳細的話,代碼更清晰一點,如果你將ID設置爲initialize,並將其引用到函數中:

var Messages = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.id = options.id; 
    }, 
    url: function() { 
    return '/messages/' + this.id; 
    }, 
    model: Message, 
}); 

var collection = new Messages([], { id: 2 }); 
collection.fetch(); 

儘管如此 - 您並沒有將idid混淆,對嗎? @ Paul的回答,以及我上面的代碼,假設您有多個Messages集合,每個集合都有自己的id。如果API路徑/messages/<id>實際上是指消息,而不是一組消息,那麼您只需在集合中將url設置爲/messages/,並且骨幹將自動爲每個模型使用/messages/<id>

+3

謝謝'尼克'這樣一個簡單明瞭的例子。我希望我能看到你的答案,我會保存一天....再次感謝。 – Shubh

+0

是的,這對我而言是未定義的。下面的答案是有效的。 –

23

你有url屬性聲明的方式,該值將被一次當瀏覽器最初加載javascript文件確定,和「身份證」將是不確定的。

Backbone.Collection接受選項作爲其構造函數中的第二個參數,因此您可以將id值作爲選項傳遞,然後在集合的初始化函數中設置url值。

下面是一個例子

var Messages = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.url = 'http://url/messages/' + options.id; 
    }, 
    model: Message, 
}); 

var collection = new Messages([], { id: 2 }); 
collection.fetch();