2010-07-16 3 views
2

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

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, так как он не содержит элемента тела.

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() вызывает ошибку, когда внешн пытается вызвать функцию template.overwrite с myDisplayPanel.body как первые пары.

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

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

ответ

0

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

+0

Да, я заметил эту настройку, но, к сожалению, она не сработала для меня по какой-то еще неизвестной причине.Я вообще отказался от рухнувшего подхода к этой панели, но я собираюсь принять ваш ответ, поскольку он теоретически должен решить эту проблему. –

+0

Извините, это не сработало для вас. Если вы хотите копать дальше, я обычно отлаживаю подобные вещи, устанавливая точку останова на строке обновления в firebug, а затем используйте консоль/часы для просмотра Ext.getCmp ('myDisplayPanel'), проверяя свойства rendered и el для это и его собственная цепочка. Последний родитель, который был визуализирован, и/или верхний родитель, который еще не отображен, являются хорошими местами для начала отладки, чтобы понять, почему ожидаемый макет не произошел. Макеты могут оказаться сложными, особенно если они сложны и вложены. –

0

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

elements: ['header','body'] 

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

+0

Прошу прощения за поздний ответ, но мой младший сын родился последним воскресеньем, заставляя меня заняться любовью. Ваше предлагаемое исправление, похоже, не работает. Я также пытался изменить порядок моих звонков, но безрезультатно. На данный момент единственным решением (обходным путем) является полное падение свернутого параметра. –

+0

Причина, по которой изменение порядка вызовов не срабатывает, заключается в том, что при расширении контейнера myPanel анимацией он стал асинхронным. Макеты по умолчанию не выполняются в свернутых/скрытых контейнерах, поэтому первоначальный макет дочерних элементов myPanel еще не был рендерен, когда сразу после вызова было вызвано обновление на myDisplayPanel. –

1

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

Где вы сейчас работаете panel.update (содержание), попробуйте следующее:

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

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

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

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

Смежные вопросы