Ext Js - пользовательское разрешение класса - PullRequest
0 голосов
/ 10 января 2020

Допустим, у меня есть конкретное представление с именем «представление». Я хотел бы, во время выполнения, иметь возможность вызывать Ext.create("view_1") или Ext.create({ xtype: "view_5" }), и они будут создавать экземпляры "view".

Таким образом, любой xtype, соответствующий регулярному выражению: / view_ [0-9] + /, должен вместо этого создать «представление».

Возможно ли это, если да, то как?

Подробнее,

Мы добавили возможность пользователям создавать собственные отчеты. Они определяют имя меню, заголовок, набор столбцов и ограничение данных, которое будет использоваться. Каждый пользовательский отчет создается с использованием одного и того же xtype view.

Проблема возникает, когда мы сохраняем состояние для этих пользовательских отчетов. Обычно мы используем xtype в качестве ключа для хранения. Поэтому, если все пользовательские отчеты имеют одинаковый тип x, они переопределяют состояние друг друга.

Прямой обходной путь - использовать разные xtype для каждого пользовательского отчета. Итак, "view_1", "view_5", "view_1008"...view_[0-9]+ - это xtypes, связанные с custom report #1, custom report #5, custom report #1008...custom report [0-9]+. Но все они должны быть построены с использованием xtype view.

. Если мы создадим псевдонимы, нам нужно будет добавить все разумные / возможные формы view_[0-9]+. Я не уверен, что этот подход очень хорошо масштабируется, когда у нас больше типов динамических c представлений.

1 Ответ

1 голос
/ 11 января 2020

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

Ext.define('SomeView', {
    alias: ['widget.view_1', 'widget.view_2', 'widget.view_3', 'widget.view_4' ...],
});

Обновление (согласно комментарию): Возможно, вы хотите создать несколько представлений (одинаковое определение) с таким идентификатором, как:

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

Обновление:

Другой способ - переопределить функцию Ext.create.

Пример https://fiddle.sencha.com/#view / editor & fiddle / 32lj

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"
            }]
        });
    }
});
...