2013-05-17 5 views
3

Я пытаюсь найти лучший вариант, чтобы сделать Backbone views повторно используемым. Я изучил и нашел много разных решений, но не уверен, какой из них соответствует моим требованиям. В основном я буду иметь много виджетов заполнены данными в реальном масштабе времени, и мне нужно базовый компонент, который будет обрабатывать подписки услугВозможность повторного использования компонентной панели

Является ли следующий лучшим решением для этой задачи:

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() 
    } 
}); 

Есть ли лучший подход? или я должен использовать микшины?

Backbone Views

ответ

1

я мог бы быть наклонен в пользу состава по наследству здесь, и создать представление вращателя, а также использовать его экземпляры в других представлениях, которые требуют спиннера функциональность.

Подробнее: Prefer composition over inheritance?

1

Типичное правило эмпирическое я использую такие вещи, как это, если есть какие-либо неизменные методы в базовом классе, которые обеспечивают общий контекст для всех подклассов, то наследование имеет смысл. Например, я создал класс BaseView для моего Backbone приложения, которое выглядит примерно так:

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() {} 
    }); 
}); 

Это довольно простой пример, но он доказал, чтобы сделать вещи намного проще для разработки моего приложения, так как моему центральному объекту контроллера задан общий интерфейс для отображения и скрытия представлений. Я полагаю, вы могли бы использовать композицию здесь, но это требует выполнения явного расширения() во время выполнения. Вы получаете тот же результат в любом случае, но я просто предпочитаю иметь доступную функциональность при создании экземпляров.

Другая мысль состоит в том, что это действительно зависит от того, чего вы хотите достичь. Наследование гораздо более жесткое, чем композиция, но опять же, это зависит от того, чего вы в конечном итоге хотите достичь, а иногда и обеспечения жесткости для поддержания контекста - это хорошо.

Смежные вопросы