#javascript #function #extjs #initialization
Вопрос:
В ExtJS 6.2 classic мы обычно реализуем initComponent
, когда расширяем компонент.
На ExtJS modern нет initComponent
for Ext.Container
, кроме constructor
того , какую функцию можно было бы заменить initComponent
в Modern?
У меня возникла проблема , потому что я реализовал инициализацию компонента в конструкторе, и когда я снова отображаю компонент, он снова запускает конструктор с config
набором, как и в предыдущем обновлении config
, поэтому компонент отображает объекты несколько раз там, где он должен отображаться только один раз.
Ext.define('AppName.view.settings.CalloutBox', {
extend: 'Ext.Container',
xtype: 'calloutbox',
layout : {
type : 'hbox',
},
constructor: function(config) {
// Added this to avoid the bug I commented above.
if (config.cls) {
this.callParent(arguments);
return;
}
config.cls = `myclass`;
// Here I programmatically add elements. These cause the bug
// because on next run of this constructor these will be
// added again.
config.items = [{
xtype : 'container',
cls : `alert__icon-box`,
layout: {
type : 'vbox',
pack : 'center',
align : 'middle'
},
items: [{
xtype :'label',
cls : `alert__icon`,
html : `<i class="x-font-icon md-icon-alert"></i>`,
}]
}];
this.callParent(arguments);
}
});
Обновить
Я выяснил причину ошибки с дублированием элементов. Это было вызвано воссозданием модала, CalloutBox
в котором он был каждый раз, вместо того, чтобы просто показывать тот, который уже открыт.
Итак, у нас было это:
Ext.Viewport.add({ xtype: 'mymodal' }).show();
А теперь:
const mymodal = Ext.getCmp('mymodal');
// If component already exists in DOM, just show it.
if (mymodal) {
mymodal.show();
return;
}
// Else we create and show it.
Ext.Viewport.add({ xtype: 'mymodal' }).show();
Комментарии:
1. Вы хотите использовать метод инициализации в современной среде. Пожалуйста, поделитесь скрипкой с вашим кодом, похоже, вы добавляете элементы в класс вместо экземпляра.
2. Привет @hwsw Я добавил несколько примеров кода.
3. Модалы обрабатываются ExtJS. Вам не следует справляться с этим самостоятельно. Попробуйте использовать маску загрузки без msg и значка.
Ответ №1:
Ознакомьтесь с initialize
шаблонным методом Container
и другими классами в современном инструментарии. Попробуйте запустить следующий код в скрипке:
Ext.define('MyContainer', {
extend: 'Ext.Container',
xtype: 'mycontainer',
initialize: function () {
this.add({
xtype: 'container',
layout: {
type: 'vbox',
pack: 'center',
align: 'middle'
},
items: [{
xtype: 'label',
html: 'label1',
},{
xtype: 'label',
html: 'label2',
}]});
}
});
Ext.create({
"xtype": "mycontainer",
renderTo: Ext.getBody()
});