Макет ExtJs + Окно

При динамическом добавлении компонента в firebug отображается «this.container is null».

У меня есть окно с некоторыми полями со списком: combo1, combo2, combo3 и ярлык. На основе значения выбора combo3 поле «метка» удаляется и заменяется полем со списком или текстовым полем. я делаю это с помощью

form.items.removeAt(4);
form.items.insert(4, newItem); #here newItem can be combox/textfield
form.doLayout();

Форма находится внутри панели.

Когда вышеуказанные строки выполняются. Отображается «this.container is null», и компонент не может быть вставлен/добавлен в соответствующую позицию.

Какие-либо предложения?


person AJJ    schedule 21.08.2012    source источник
comment
Какой менеджер компоновки вы используете?   -  person davidbuzatto    schedule 21.08.2012
comment
Не вызывайте doLayout(), если вы используете ExtJS4, кстати. Удаление работает?   -  person Johan Haest    schedule 21.08.2012
comment
Прежде всего, используйте исходный файл ext-all-debug.js или ext-all-dev.js, чтобы увидеть весь процесс отладки в Firebug. Вы увидите, на каком шаге возникает ошибка.   -  person s.webbandit    schedule 21.08.2012


Ответы (2)


Вы не должны изменять базовую коллекцию элементов. Используйте методы удаления/вставки в контейнере.

person Evan Trimboli    schedule 22.08.2012

Попробуйте прокомментировать эти строки построчно, чтобы увидеть, какая из них вызывает ошибку, например

form.items.removeAt(4);
//form.items.insert(4, newItem); #here newItem can be combox/textfield
//form.doLayout();

form.items.removeAt(4);
form.items.insert(4, newItem); #here newItem can be combox/textfield
//form.doLayout();

form.items.removeAt(4);
form.items.insert(4, newItem); #here newItem can be combox/textfield
form.doLayout();

Ваша проблема может возникнуть из-за того, что вставленный/замененный объект еще не подготовлен, когда вы пытаетесь его вставить. Дайте нам ваш код инициализации newItem.

Обновлено

Или вы можете обернуть изменяющиеся компоненты (ярлык, поле со списком, текстовые поля) в панель с помощью card макет. А при смене combo3 просто выберите card в этой панели.

person s.webbandit    schedule 21.08.2012
comment
Спасибо за ваш ответ. Ошибка возникает в form.doLayout(). Компонент успешно вставлен. Но пока doLayout() отображается ошибка. - person AJJ; 22.08.2012
comment
Какая у вас версия ExtJS? Как насчет использования ext-all-debug.js или ext-all-dev.js? Дайте нам отладочную информацию от firebug. - person s.webbandit; 22.08.2012
comment
Использование extjs 3.4. При использовании ext-all-debug.js возникают ошибки в render: function (conatiner, position)() в строке position=this.container.dom.addChild[position] - person AJJ; 22.08.2012
comment
Ошибка 11362: position = this.container.dom.childNodes[position]; в ext-all-debug.js - person AJJ; 22.08.2012
comment
А без doLayout() invoke вы не сможете решить свою задачу? Попробуйте просто replace() добавить к вашей этикетке другой компонент. - person s.webbandit; 22.08.2012
comment
Спасибо за Ваш ответ. я нашел временное решение, похожее на ваш обновленный ответ. Первоначально у меня будет скрыто комбо3/текстовое поле, и на основе выбора из комбо2, комбо3/текстовое поле будет отображаться. - person AJJ; 22.08.2012
comment
Я не могу принять ответ здесь на заданный вопрос. Может быть, ваши ответы сработают, но мне это не поможет в моей структуре. Как бы то ни было, ваш комментарий к replace() дал мне подсказку для решения скрытия и замены. Спасибо еще раз. - person AJJ; 23.08.2012