Поскольку у вас уже есть Panel, которая использует contentEl для визуализации HTML в своем теле, я рекомендую придерживаться этого подхода:
Замените панель экземпляром Ext.form.Panel - конфигурация, особенно конфигурация contentEl, может остаться неизменной.
Код, предоставленный здесь, переопределит стандартный класс Ext (Ext.layout.Layout) и введет поддержку свойства конфигурации renderItemTo для дочерних элементов любого контейнера Ext или панели (включая Ext.form.Panel).
Значение свойства config должно быть идентификатором уже отрисованного узла DOM, например, элемент DIV, являющийся частью фрагмента HTML, используемого в качестве contentEl тела родительского контейнера.
Ext.require(['Ext.layout.Layout'], function() {
Ext.override(Ext.layout.Layout, {
renderItem: function (item, target, position) {
if(item.renderItemTo) {
// render 'renderItemTo' components into the specified DOM element
item.render(item.renderItemTo, 1);
// don't allow container layout to seize the component
item.layoutManagedHeight = 2;
item.layoutManagedWidth = 2;
} else {
// just use standard Ext code for non-renderItemTo components
this.callOverridden(arguments);
}
},
isValidParent: function(item, target, position) {
// signal Ext that we are OK with were our 'renderItemTo' component is right now
// otherwise it would get moved during the layout process
return item.renderItemTo ? true : this.callOverridden(arguments);
}
});
});
Использование:
var panel = Ext.create('Ext.form.Panel', {
contentEl: 'form', // the DOM element ID that holds the HTML fragment for the body
title: 'My FormPanel with special FX',
items: [
{
xtype: 'textfield',
renderItemTo: 'text1', // the ID of a DOM element inside the HTML fragment
fieldLabel: 'Label 1',
},
{
xtype: 'textfield',
renderItemTo: 'text2', // the ID of a DOM element inside the HTML fragment
fieldLabel: 'Label 2'
}
]
});
Я загрузил рабочий пример в JSFiddle (примечание: измените размер окна, если у вас возникла проблема с рендерингом - это связано с JSFiddle, а не с переопределением).