2012-09-29 30 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(假设您的模板系统支持它们),以防止模板变得过于混乱。 –