ExtJs-自定义类解析

ExtJs-自定义类解析,extjs,extjs6-classic,Extjs,Extjs6 Classic,假设我有一个名为“视图”的具体视图。我希望在运行时能够调用Ext.create(“视图1”)或Ext.create({xtype:“视图5”}),它们将创建“视图”的实例 因此,任何与regex:/view\u0-9]+/匹配的xtype都应该创建一个“视图” 这可能吗?如果可能,怎么可能 更多细节 我们增加了用户创建自定义报告的能力。它们定义菜单名、标题、列集和要使用的数据约束。每个自定义报告都使用相同的xtype视图构建 当我们保存这些自定义报告的状态时,会出现问题。通常,我们使用xtype

假设我有一个名为“视图”的具体视图。我希望在运行时能够调用
Ext.create(“视图1”)
Ext.create({xtype:“视图5”})
,它们将创建“视图”的实例

因此,任何与regex:/view\u0-9]+/匹配的xtype都应该创建一个“视图”

这可能吗?如果可能,怎么可能

更多细节

我们增加了用户创建自定义报告的能力。它们定义菜单名、标题、列集和要使用的数据约束。每个自定义报告都使用相同的xtype
视图构建

当我们保存这些自定义报告的状态时,会出现问题。通常,我们使用xtype作为存储密钥。因此,如果所有自定义报告都是相同的xtype,它们将覆盖彼此的状态

直接的解决方法是为每个自定义报告使用不同的xtype。因此
“视图1”、“视图5”、“视图1008”…视图[0-9]+
是与
自定义报告1、自定义报告5、自定义报告1008…自定义报告[0-9]+
关联的X类型。但它们都应该使用xtype
view
构建


如果我们创建别名,我们需要添加所有合理/可能的
view\u0-9]+
。当我们有更多类型的动态视图时,我不确定这种方法是否能够很好地扩展。

不可能从正则表达式创建视图。 在我看来,最好的方法是将alias设置为字符串列表。 例如:

更新(根据评论): 可能需要创建id为的多个视图(相同定义),如:

Ext.create("SomeView", {
    id: "view_1",
});
Ext.create("SomeView", {
    id: "view_2",
});
更新:

另一种方法是重写
Ext.create
函数

榜样

使用方法:

Ext.application({
    name: 'Fiddle',

    launch: function () {

        Ext.create("Ext.panel.Panel", {
            width: 300,
            height: 300,
            renderTo: Ext.getBody(),
            items: [{
                xtype: 'viewx',
                fieldLabel: "AA"
            }, {
                xtype: 'viewx_1',
                fieldLabel: "AA"
            }, {
                xtype: 'viewx_2',
                fieldLabel: "AA"
            }]
        });
    }
});

后缀是来自数据库的ID,因此它们在运行时之前是未知的。可以只指定一个“有效”别名范围,但这需要声明数千个别名。请检查我的更新,也许这就是您要查找的。这里没有其他解决方案。提供了有关我面临的场景的更多详细信息,希望它能让事情变得更清楚。您不能将状态保存为每个创建的视图标识符而不是xtype吗?事情是这样构建的;当然可以为这些显示器重新进行状态管理,但我希望避免这种情况。我希望有一个内置的(可扩展的)特性来支持这一点。为它们中的每一个设置
xtype
有什么意义?这就破坏了整个想法。如果两个视图具有相同的xtype,则它们是相同的。如果我想将每个自定义报告视为不同的视图,它们需要自己的xtype。
Ext.apply(Ext, {
    _create: Ext.create
});

Ext.override(Ext, {
    create: function () {
        var name = arguments[0],
        nameType = typeof name;

        if(nameType == 'string'){
            let regex = /widget\.viewx_[0-9]+/;
            let found = name.match(regex);

            if (found) {
                name = "widget.viewx";
            }
        }

        return Ext._create(name, arguments[1], arguments[2], arguments[3]);
    }
});
Ext.application({
    name: 'Fiddle',

    launch: function () {

        Ext.create("Ext.panel.Panel", {
            width: 300,
            height: 300,
            renderTo: Ext.getBody(),
            items: [{
                xtype: 'viewx',
                fieldLabel: "AA"
            }, {
                xtype: 'viewx_1',
                fieldLabel: "AA"
            }, {
                xtype: 'viewx_2',
                fieldLabel: "AA"
            }]
        });
    }
});