【问题标题】:Backbonejs View Rendering Best ApproachBackbonejs 查看渲染最佳方法
【发布时间】:2012-09-29 16:08:46
【问题描述】:

我有一个侧边栏视图,其中包含类似这样的项目列表

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 更优雅一点,但在视图中包含逻辑语句有点太 hacky。

无论如何,我的问题是我应该使用方法 2 还是有更好的方法来解决这个问题?

谢谢

【问题讨论】:

    标签: backbone.js backbone-views backbone-routing


    【解决方案1】:

    你为什么不让 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});
     }
    

    【讨论】:

    • 有趣,如果没有其他人有更好的答案,那么我可以使用这个。谢谢!
    • 顺便说一句,在您的视图中拥有一组条件逻辑并没有什么奇怪的。我们的视图中有条件,它们知道如何为已通过身份验证的用户和未通过身份验证的用户显示页面。它们是相同的页面,但它们有一些小的差异。维护两个独立的视图将是巨大的矫枉过正,并且违反了 DRY 原则。
    • @QuynhNguyen:如果差异开始变大,您可能可以使用部分(假设您的模板系统支持它们)来防止模板变得过于混乱。
    • @QuynhNguyen,因为 muistooshort 提出了这一点,请允许我为我们在整个网站中使用的dust.js 提供支持。支持部分、模板的预编译和许多其他的东西
    猜你喜欢
    • 1970-01-01
    • 2015-10-10
    • 2012-08-13
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多