2011-06-29 100 views
26

我在我的Backbone.js應用程序中有一個模型集合。在Backbone.js集合中選擇一個模型的最佳方法?

這是您可以使用鼠標懸停在上面或使用鍵盤瀏覽的項目列表。

如果鼠標懸停,或者如果鍵盤導航有選擇的項目,他們都將做同樣的事情:設置進行「選擇」特定的項目/模型。

所以在我的模型,我有一個屬性基本上叫做

selected: false 

當它的上空盤旋,或用鍵盤選擇,這將隨後是

selected: true 

但是,什麼是最好的確保當這一個模型是真的時,其他人都是假的?

我電流通過集合中的每個模型做騎自行車的基本的東西,然後將所選擇的模型是真實的。但我想知道是否有更好,更有效的方法來做到這一點?

回答

31

被選定似乎是模型範圍之外的責任。選擇的概念意味着其他人,但模型只能擔心自己。因此,我會考慮把這個責任推到其他地方,其中許多模型的概念和選擇一個似乎更自然和預期。

所以考慮把這個責任放在集合上作爲一個關聯。所以,這個選擇會指向選定的模型。然後你可以添加一個方法來返回一個集合中的選定模型。

或者,您可以將此責任歸於視圖。如果模型的選擇完全是View層中的一個問題,那麼你可以這樣做。

副產品去除模型的責任是你消除在整個收集需要週期,當一個新的模式變爲選中。

+1

謝謝。這樣做更有意義。我越來越沉迷,並沒有花時間更深入地思考事情應該發生的地方。請謹慎使用 – littlejim84

3

我做了一些像艾森豪厄爾先生的建議。我也想要分頁數據的概念。並不是真的想將所選的頁碼等混合到集合本身中,所以我爲表格數據創建了一個「模型」並將其稱爲快照。像這樣的東西:

JobSummary = Backbone.Model.extend({}); 

JobSummaryList = Backbone.Collection.extend({ 
    model: JobSummary 
}; 

JobSummarySnapshot = Backbone.Model.Extend({ 
    defaults: { 
    pageNumber: 1, 
    totalPages: 1, 
    itemsPerPage: 20, 
    selectedItems: new JobSummaryList(), // for multiple selections 
    jobSummaryList: new JobSummaryList() 
    } 
}); 
+2

默認值,請記住它們是在所有JobSummarySnapshot實例中引用的。如果使用像Number/String這樣的基元,這不是問題,但當JobSummaryList時這是一個問題。 – ekeren

15

這是我這樣做的方式。該集合存儲對所選模型的引用,但狀態保留在模型中。這可以適應於允許更多更復雜的算法來選擇哪些模型。

JobSummary = Backbone.Model.extend({ 

    setSelected:function() { 
    this.collection.setSelected(this); 
    } 

}); 

JobSummaryList = Backbone.Collection.extend({ 
    model: JobSummary, 

    initialize: function() { 
    this.selected = null; 
    }, 

    setSelected: function(jobSummary) { 
    if (this.selected) { 
     this.selected.set({selected:false}); 
    } 
    jobSummary.set({selected:true}); 
    this.selected = jobSummary; 
    } 
}; 
1

退房Backbone.CollectionView,其中包括支持選擇模型,當他們被點擊開箱。您可以使用setSelectedModel方法實現的懸停案例。

1

你可能想看看我的兩個組成部分:

Backbone.Select具有最小表面積。儘可能少的方法被添加到你的對象。這個想法是,你應該可以在任何地方使用Backbone.Select混合,幾乎沒有衝突的風險。

Backbone.Cycle是建立在Backbone.Select的頂部。它增加了導航方法和更多的花裏胡哨的功能。這可能是綠地項目的更好選擇。

相關問題