ExtJs 5.1:在运行时更改超类

时间:2015-06-23 07:44:37

标签: javascript inheritance extjs extend extjs-grid

我有以下两个扩展ExtJs Grid面板的类:

  1. ReadonlyDataGrid - 顾名思义,基本不可编辑的ExtJs网格
  2. EditableDataGrid - 带有单元格&amp ;;的ExtJs网格行编辑插件
  3. 现在我想提供一个新类,它将根据开发人员在网格JSON配置中设置的属性扩展上述两个类之一

    例如:

    Java:

    parentObj.put("gridType", "readonly");
    

    JS:

    Ext.define('Grid.view.GridFactory', {
    extend: 'Grid.view.AbstractGridFactory',
    alias: 'widget.gridfactory',
    singleton: true,
    create : function(model){
        var grid;
        switch(model.input.gridType)
        {
            case 'readonly':
                grid = new Grid class extending the ReadonlyDataGrid class;
                break;
            case 'editable':
                grid = new Grid class extending the EditableDataGrid class;
                break;          
        }
    
        return grid;
      }
    });
    

    现在我必须创建两个单独的类文件来处理这个问题。

    第1课:

    Ext.define('Grid.view.EditableGrid',{
    extend : 'Grid.view.EditableDataGrid',
    .... //additional features
    });
    

    第2课:

    Ext.define('Grid.view.ReadonlyGrid',{
    extend : 'Grid.view.ReadOnlyDataGrid',
    .... //additional features
    });
    
    1. 如何将这两个类合并为1?
    2. 如何根据用户配置更改extend属性或扩展正确的类,如上所示?
    3. 设计明智什么是更好的?有1个类并在运行时更改superClass或维护2个类但是使用冗余/相同的代码?

1 个答案:

答案 0 :(得分:1)

  1. 使用mixins
  2. 从技术上讲,您可以在运行时定义类,并选择您认为合适的任何extend属性:
  3. Ext.define('Grid.view.RuntimeGrid',{
        extend: 'Grid.view.' + (model.input.gridType === 'readonly' ? 'ReadonlyDataGrid' : 'EditableDataGrid'),
        //additional features
    });
    

    但这是不好的做法。

    1. 在运行时更改superClass更糟糕。 Designwise,有两个看似明显的选择:

      • 有两节课,但不要重复自己:把你的"多余的/同样的"将代码编入mixin并将其包含在两个类中; OR
      • 只有一个类可以在配置时编辑。它会接受一个配置选项editable,并且仅在选项为true时才会实例化相关的编辑插件/编辑器。