Принудительно Ext создать элемент тела для скрытой (свернутой) панели

Я создал панель в комплекте с Ext.Template. Эта панель содержится в другой панели, которая начинает свою жизнь свернутой.

id:             'myPanel',
title:          'My Title',
layout:         'border',
collapsible:    true,
collapsed:      true,
hideCollapseTool:true,
bodyBorder:     false,
height:         300,
bodyStyle:      'background:#F9F9F9;',
items: [{
    id:         'myDisplayPanel',
    bodyStyle:  'background:transparent;',
    width:      300,
    border:     false,
    margins:    '5 5 5 5',
    region:     'west',
    tpl:        new Ext.Template([
                    'some template'
                ])
},
{
    id:         'myForm',
    xtype:      'form',
    bodyStyle:  'background:transparent;',
    border:     false,
    margins:    '5 5 5 5',
    region:     'center',
[...]

Предполагается, что эта панель-шаблон обновляется в результате выбора строки в соседней сетке. Но я получаю сообщение об ошибке при первом вызове .update(data); на myDisplayPanel, так как он не содержит элемента body.

myGridSelectionModel: new Ext.grid.RowSelectionModel({
    singleselect: true,
    listeners: {
        rowselect: function(sm,rowIdx,r) {
            Ext.getCmp('myDisplayPanel').update(r.data);
            Ext.getCmp('myPanel').expand(true);
        }
    }
}),

Вызов myDisplayPanel.update() вызывает ошибку, когда Ext пытается вызвать функцию template.overwrite с myDisplayPanel.body в качестве первого параметра.

function(b,a,c){b=Ext.getDom(b);b.innerHTML=this.applyTemplate(a);

Можно ли как-то заставить Ext генерировать элемент тела для этой скрытой панели до того, как она будет показана? Я пытался расширить элемент перед его обновлением, но теперь это действует...


person Ivar Bonsaksen    schedule 16.07.2010    source источник


Ответы (3)


Свернутые панели (и вообще скрытые контейнеры) по умолчанию не размещают свои дочерние элементы, пока они не станут видимыми. Вы можете переопределить это поведение, установив forceLayout : true для свернутого контейнера. Как следует из названия, это заставит контейнер выполнять свою компоновку независимо от того, виден он или нет. Обратите внимание, что в вашем случае это будет myPanel, которому потребуется эта конфигурация, а не myDisplayPanel.

person Kevin Vaughan    schedule 15.08.2010
comment
Да, я заметил эту настройку, но, к сожалению, она у меня не работала по неизвестной до сих пор причине. Я полностью отказался от свернутого подхода для этой панели, но я собираюсь принять ваш ответ, поскольку теоретически он должен решить проблему такого рода. - person Ivar Bonsaksen; 16.08.2010
comment
Извините, это не сработало для вас. Если вы хотите копнуть глубже, я обычно отлаживаю такие вещи, устанавливая точку останова в строке обновления в firebug, а затем использую консоль/часы для просмотра Ext.getCmp('myDisplayPanel'), проверяя свойства rendered и el на наличие это и его цепь ownerCt. Последний родительский элемент, который был визуализирован, и/или верхний родительский элемент, который еще не визуализировался, являются хорошими местами для начала отладки, чтобы увидеть, почему ожидаемый макет не возник. Макеты могут быть сложными, особенно если они сложные и вложенные. - person Kevin Vaughan; 16.08.2010

Я знаю, что этой ветке уже 2 месяца, поэтому я не уверен, что вы когда-нибудь находили решение. Однако я только что столкнулся с тем же и наткнулся на вашу тему, когда искал ответ. Вот что я в итоге сделал:

Там, где вы сейчас используете panel.update(content), попробуйте следующее:

if(panel.rendered) panel.update(content);
else panel.contentToLoad = content;

Настройте прослушиватель для запуска события рендеринга:

if(this.contentToLoad) panel.update(this.contentToLoad);

Таким образом, если панель не визуализируется, она будет хранить содержимое где-то, а прослушиватель рендеринга загрузит все, что есть, когда панель будет визуализирована.

person Derek    schedule 11.10.2010

Вы можете попробовать конфигурацию Panel elements, которая из docs – это "список элементов панели, разделенных запятыми, которые необходимо инициализировать при отображении панели". Так, например,

elements: ['header','body']

Однако по умолчанию уже используется только «тело», поэтому может случиться так, что панель действительно еще не отображается, когда вы ее обновляете. Попробуйте изменить порядок ваших вызовов на обратный, чтобы сначала расширялся контейнер (чтобы заставить дочернюю панель отображать), а затем обновляйте его.

person Brian Moeskau    schedule 16.07.2010
comment
Извините за поздний ответ, но мой младший сын родился в прошлое воскресенье, поэтому я немного занят. Предлагаемое вами исправление, похоже, не работает. Я также пытался изменить порядок моих звонков, но безрезультатно. На данный момент мое единственное решение (обходной путь) — полностью отказаться от свернутого параметра. - person Ivar Bonsaksen; 26.07.2010
comment
Причина, по которой изменение порядка вызовов не сработало, заключается в том, что когда контейнер myPanel расширяется с помощью анимации, он становится асинхронным вызовом. Макеты по умолчанию не выполняются для свернутых/скрытых контейнеров, поэтому первоначальный макет дочерних элементов myPanel еще не был отрисован, когда сразу после этого было вызвано обновление для myDisplayPanel. - person Kevin Vaughan; 15.08.2010