Extjs множественное наследование? - PullRequest
5 голосов
/ 08 февраля 2011

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

У меня есть настроенный компонент GridPanel в моей структуре, называемый Kore.ux.grid.GridPanel. Он расширяет Ext.GridPanel дополнительными общими функциями и предоставляет интерфейс для действий REST.

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

У меня вопрос: можно ли как-нибудь расширить Ext.EditorGridPanel, чтобы использовать пользовательские функции Kore.ux.grid.GridPanel?

Извините за любые грамматические ошибки, и я могу перефразировать его, если это сбивает с толку. Спасибо !!

EDIT

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

Спасибо!

ИЗМЕНИТЬ СНОВА

Извините, я нашел структуру, которая мне подходит .. Вот метод, который я нашел полезным для меня:

var Common = function(){}   //abstract class
Ext.apply(Common.prototype, {

    a : function(){},
    b: function(){}...

});

Ext.ux.SomePanelA = Ext.extend ( Ext.Panel, {

    stuff : ............

});

Ext.ux.SomePanelB = Ext.extend ( Ext.Panel, {

    diffStuff : ............

});

Ext.applyIf(Ext.ux.SomePanelA.prototype, Common.prototype);
Ext.apply(Ext.ux.SomePanelB.prototype, Common.prototype);

Код Источник: http://www.sencha.com/forum/showthread.php?48000-multiple-inheritance&p=228271&viewfull=1#post228271

Пожалуйста, еще раз предоставьте полезные предложения, если вы считаете, что у вас есть лучшее решение :) Спасибо!

Ответы [ 3 ]

5 голосов
/ 08 февраля 2011

Что вам действительно нужно посмотреть, так это плагины ExtJS.

/**
 * Boilerplate code taken from 'ExtJS in Action' by Jay Garcia
 */
YourNameSpace.RestGridPlugin = Ext.extend(Object, {
  constructor : function(config) {
    config = config || {};
    Ext.apply(this.config);
  },

  init : function(parent) { //parent argument here, is whatever you apply your plugin to
    parent.on('destroy', this.onDestroy, this);
    Ext.apply(parent, this.parentOverrides);
  },

  onDestroy : function() {
    //here you need to free any resources created by this plugin
  },

  parentOverrides : {
    //here you do your magic (add functionality to GridPanel)
  }

});

Ext.preg('restgridplugin',YourNameSpace.RestGridPlugin); //register your brand ne plugin

Использование

someGrid = {
  xtype: 'grid',
  columns: ...
  store: ...
  plugins: [
    'restgridplugin'
  ]
}

someEditorGrid = {
  xtype: 'editorgrid',
  columns: ...
  store: ...
  plugins: [
    'restgridplugin'
  ]
}
0 голосов
/ 05 июля 2015

Я не согласен с использованием плагинов для выполнения множественного наследования в Ext.Плагины предназначены для изменения поведения или добавления новых функций.

Правильный способ достижения множественного наследования - использование Mixins. Пожалуйста, посмотрите это удивительное объяснение SenchaCon 2011: Система классов Sencha

 Ext.define('FunctionalityA', {
     methodA: function () {
         ...
     }
 });

 Ext.define('FunctionalityB', {
     methodB: function () {

     }
 });

 Ext.define('MultipleFunctionality', {
     mixins: [
         'FunctionalityA',
         'FunctionalityB'
     ],

     method: function () {
         methodA();
         methodB();
     }
 });
0 голосов
/ 08 февраля 2011

Создать Kore.ux.grid.AbstractGridPanel в качестве базового класса с общей функциональностью.И создайте два дочерних класса: Kore.ux.grid.GridPanel и Kore.ux.grid.EditorGridPanel (с определенными функциями).

...