2013-06-04 65 views
0

我有一個模型集合。 我想爲該集合中的所有模型呈現相同的視圖,但視圖應該是唯一的視圖除外。Marionette.js:渲染集合中的一個模型的不同視圖

通常情況下,我會使用一個CollectionView爲整個集合呈現相同的ItemView,但這不適用於我的情況。

我想過的選項有:

  1. 使用ItemView控件同樣適用於所有型號,但在它的一些邏輯呈現的東西是具體型號的不同。
  2. 使用CompositeView獲取沒有唯一模型的集合,並獲取該獨特模型作爲其模型。然後以一種方式呈現集合,並以其他方式呈現模型。

哪個選項更好?還有其他建議嗎?

回答

0

我想你的第二個想法:使用接收「特殊模型」和集合的複合視圖。

但是,如果您有一個需要以不同方式處理的模型,則可能需要重新考慮您的數據結構。這似乎是一個不尋常的設置,但也許有更好的方法來解決這個問題。

+0

我有一個列表中有10個選項供用戶選擇。其中9個設置了一些預定義的值,1個需要用戶輸入這些值。因此,10箇中的9個需要顯示爲單選按鈕,1個顯示爲帶有附加輸入字段的單選按鈕。 我已經將選項定義爲一組模型。你看到我的數據結構中可以改變的東西嗎? – elanh

+1

您應該能夠確定選項是否需要用戶輸入來檢查模型。如果是這種情況,只需在模板中檢查,併爲所有選項模型使用相同的模板。你有沒有嘗試過這種方法? –

+0

我們的方法是使用無邏輯模板。我們將所有的邏輯封裝在View中。但是,如果我明白了你的意思,我應該讓選項模型知道它是否需要用戶輸入,並讓ItemView爲模型實例顯示其他東西,以表示它們需要用戶輸入? – elanh

2

我有一個類似的ish用例集合的嵌套集合。我使用CompositeView遞歸渲染樹的所有節點,每個節點可能需要稍微不同的模板。通過使用getTemplate方法,我可以檢查模型並使用幾種不同模板中的一種。幾乎所有@David概述,但這裏是一個例子:

getTemplate: function(){ 
    var template; 
    switch (this.model.get('type')) { 
    case 'film': 
     template = 'film'; 
     break; 
    case 'item': 
     template = 'item'; 
     break; 
    case 'year': 
    case 'decade': 
     template = 'node'; 
     break; 
    } 
    return template; 
}, 
相關問題