Force Ext для создания элемента body для скрытой (свернутой) панели - PullRequest
2 голосов
/ 16 июля 2010

Я создал панель в комплекте с 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 сгенерировать элемент тела для этой скрытой панели до того, как она будет показана?Я пытался развернуть элемент до его обновления, но теперь это имеет эффект ...

Ответы [ 3 ]

1 голос
/ 11 октября 2010

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

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

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

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

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

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

0 голосов
/ 15 августа 2010

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

0 голосов
/ 16 июля 2010

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

elements: ['header','body']

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

...