3

我正在尝试找到使 Backbone 视图可重用的最佳选择。我仔细观察并找到了许多不同的解决方案,但不确定哪一个适合我的要求。基本上我将有许多填充实时数据的小部件,我需要一个处理服务订阅的基本组件

正在遵循此问题的最佳解决方案:

App.View.Base = Backbone.View.extend({
  baseMethod: function( params ) {};
});

App.ExtendedView.Base = App.View.Base.extend({
  // new stuff here

  // overriding App.View.Base.baseMethod
  baseMethod: function( params ) {
    // overriding stuff here 
    App.View.Base.prototype.baseMethod.call(this, params); // calling super.baseMethod()
  }
});

有没有更好的方法?还是我应该使用mixins?

主干视图

4

2 回答 2

1

在这里,我可能更倾向于组合而不是继承,并创建一个微调器视图,并在其他需要微调器功能的视图中使用它的实例。

更多信息:更喜欢组合而不是继承?

于 2013-05-17T14:01:32.787 回答
1

我用于此类事情的典型经验法则是,如果基类中有任何不可变的方法为所有子类提供公共上下文,那么继承是有意义的。例如,我为我的 Backbone 应用程序创建了一个 BaseView 类,它看起来像这样:

define(function() {
    return Backbone.View.extend({
        /**
         * show() and hide() are immutable
         */
        show : function() {
            this.beforeShow();
            this.doShow();
            this.afterShow();
        },
        hide : function() {
            this.beforeHide();
            this.doHide();
            this.afterHide();
        },
        doShow : function() {
            this.$el.show();
            this.trigger('displayComplete', {action : 'show'});
        },
        doHide : function() {
            this.$el.hide();
        },
        //Override the following to extend behavior of the view
        //before and/or after the view is shown/hidden.            
        beforeShow : function() {},
        beforeHide : function() {},
        afterShow : function() {},
        afterHide : function() {}
    });
});

这是一个非常简单的示例,但事实证明,它使我的应用程序开发变得更加容易,因为我的中央控制器对象被赋予了一个用于显示和隐藏视图的通用界面。我想你也可以在这里使用组合,但这需要在运行时进行显式的 extend() 。无论哪种情况,您都会得到相同的结果,但我更喜欢在实例化视图时提供可用的功能。

另一个想法是,这真的取决于你想要完成什么。继承比组合更严格,但同样,它取决于您最终想要完成的任务,有时强制执行严格以维持上下文是一件好事。

于 2013-05-17T17:48:18.627 回答