2010-12-10 5 views
2

У меня есть панель Ext Js, которую я добавляю к моей основной вкладке TabPanel. Панель, которую я добавляю, содержит FormPanel как один из его элементов, а внутри FormPanel у меня есть поле Name. Я хочу изменить имя вкладки на основе имени в поле формы.Невозможно вызвать getValues ​​() на Ext Js FormPanel при инициализации контейнера Panel

Проблема заключается в том, что если я называю FormPanel-х getForm().getValues() внутри InitComponent панели, я получаю следующую яваскрипта ошибку:

Uncaught TypeError: Cannot read property 'dom' of undefined 

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

Я пытался прослушать события. Я пробовал:

this.detailForm.on('afterrender', function() { alert('test'); }); 

но делать это показало, что AfterRender называется до формы фактически оказанной (это не видно на экране). Изменение предупреждения для моего настраиваемого обработчика функций приводит к предыдущему исключению dom. Я попытался использовать события activate и enable вместо afterrender, но даже если API говорит, что FormPanel запускает эти события, предупреждение ('test') никогда не вызывается.

Я не могу найти способ, чтобы моя панель получала внутренние значения FormPanel при загрузке моей панели. У кого-нибудь есть идеи?

ответ

3

Использование getFieldValues ​​() вместо getValues ​​() будет собирать значения, вызывая метод getValue() экземпляра каждого поля вместо чтения из DOM. Это должно позволить вам получать ваши значения независимо от отображаемого состояния формы.

+0

Оба, похоже, работают, но я отмечаю это как ответ, потому что я думаю, что это лучше, чем полагаться на событие afterlayout – KallDrexx 2010-12-10 05:58:25

1

У меня такие же проблемы в одном из моих проектов, мне удалось исправить это, используя событие afterlayout.

0

Я бы дал установку .deferredRender: ложь.

Ext.TabPanel.deferredRender

Вероятно, лучше всего, чтобы выкатить из ваших изменений afterlayout, а затем проверить только с прямым deferredRender: ложному элементом конфигурации.

Я считаю, что проблема вызвана тем, что неактивные вкладки не отображаются до тех пор, пока они не станут активными. В вашем сценарии вы не можете получить значения, потому что они не существуют, пока вкладка не активирована/показана.

Установка deferredRender: false отобразит элементы во всех вкладках. Может произойти удар производительности, установив deferredRender: false, поэтому тестирование должно быть выполнено.

Надеюсь, это поможет.

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

  • Нет связанных вопросов^_^