2012-09-29 33 views
0

我有項目列表的側邊欄視圖,像這樣Backbonejs視圖呈現最好的辦法

SideBarView = Backbone.View.extend(
    events: 
    "click item": "dosomething" 
    render: 
    //Render item list from a collection 
) 

現在,我想顯示在兩種不同的路線側邊欄的看法,但我遇到了一個小問題。在路線A上,我希望dosomething()方法打印「A」,而在路線B上,我希望dosomething()方法打印「B」。所以,我想知道這個問題最好的辦法是什麼?我想到了它,並提出了以下兩種方法,但都不夠優雅。

方法1

再拍SideBarView,並呼籲然後SideBarView2改變方法的DoSomething到dosomethingForRouteB。那麼我可以使用SideBarView2作爲路由B.但是,這違反了DRY原則;更何況,讓我說我想稍後改變SideBarView的渲染方法,那麼我將不得不在兩個不同的地方進行更改。總的來說,我認爲這是一個非常不好的做法

方法2

裏面的DoSomething的()方法,我可以有像這樣

route = getCurrentRoute() 
if(route = "/routeA") 
print A 
else 
print B 

一點比方法更優雅的邏輯語句1,但是在你的視圖中有一個邏輯陳述有點太過分。

無論如何,我的問題是,我應該使用方法2還是有更好的方法來解決這個問題?

感謝

回答

2

爲什麼你不讓SideBarView接受你想要顯示的東西的參數。

SideBarView = Backbone.View.extend({ 
    print_value: B, 

    events: {...}, 

    initialize: function(options){ 
     options = options || {}; 
     if(options.display === 'A'){ 
      this.print_value = "A"; 
     } 
    }, 

    render: function(){ ...} 
} 

然後在你的路由器:

route_method: function(path){ 
    new SideBarView({display: path}); 
} 
+0

有趣的是,如果沒有其他人有更好的答案,然後我可以利用這一點。謝謝! – Infinity

+1

順便說一句,在你的視圖中有一套有條件的邏輯是沒有什麼不妥的。在我們的視圖中,我們有條件知道如何顯示經過身份驗證的用戶和未經身份驗證的用戶的頁面。它們是相同的頁面,但它們有一些小的差異。保持兩個單獨的觀點將是巨大的矯枉過正和違反DRY本金。 – tkone

+0

@QuynhNguyen:如果差異開始變大,您可能會使用partials(假設您的模板系統支持它們),以防止模板變得過於混亂。 –