Можно ли использовать одну и ту же форму в двух разных окнах в Extjs4?

У меня есть таблица с кнопкой для добавления нового элемента и еще одна в строке для редактирования элемента. Эти действия имеют одну и ту же форму с той лишь разницей, что в режиме редактирования форма заполняется. Когда пользователь нажимает на кнопку, открывается новое окно с формой.

Первый раз, когда я нажимаю кнопку, например, чтобы добавить новый элемент, все работает нормально. Показана форма. Но... если я закрою окно и попытаюсь отредактировать пользователя, появится дополнительное окно без содержимого и ошибка "TypeError: b is null" Это проблема с определением формы ? Может форма удалена вместе с окном?

У меня есть форма, определенная в var:

var formPanel =  Ext.create('Ext.form.Panel',{
     extend: 'Ext.form.Panel',
     id: 'policyForm',
     ...

У меня есть кнопка на панели сетки, чтобы показать окно, чтобы добавить пользователя, и еще одна кнопка в строке, чтобы отредактировать его. Это обработчик кнопки:

handler : function(){
    Ext.create('Ext.window.Window',{
        layout: 'fit',
        title: 'New Policy',
        items: [formPanel],
        width: 650,
        height: 500,
        id: 'myPolicyWindow'
    }).show();
}

person mannuk    schedule 01.07.2013    source источник


Ответы (2)


Очень вероятно, что те id, которые вы установили в своем коде Panel и Window, не позволяют вам повторно использовать одну и ту же форму в разных окнах. Вы должны стараться избегать использования свойства id в компонентах Ext, это может вызвать проблемы, подобные этой, поскольку идентификаторы должны быть уникальными. Используйте свойство itemId в сочетании с Ext.ComponentQuery, чтобы разрешить получение ссылок на компоненты без использования Ext.getCmp(compId).

person kevhender    schedule 01.07.2013
comment
Кевхендер, спасибо. Я решил это, удалив идентификаторы, определив пользовательскую форму, а затем создав разные экземпляры для своих окон. Я больше не буду использовать свойство id. В любом случае, если вы устанавливаете элемент с itemId, как вы можете вызвать его, чтобы получить экземпляр? - person mannuk; 02.07.2013
comment
Вам нужно будет использовать компонентные запросы для навигации по компонентам по отношению. При использовании itemId используйте знак # в запросе компонента: parentCmp.down('#childCmpId'). См. документацию по адресу docs.sencha.com/extjs/4.2. 1/#!/api/Ext.ComponentQuery. - person kevhender; 02.07.2013
comment
Спасибо @kevhender. Похоже на jquery :) - person mannuk; 02.07.2013

Я согласен, что вы не должны использовать идентификаторы. Однако фактическая проблема, вероятно, заключается в том, что вы подозреваете: экземпляр формы уничтожается. Это связано с тем, что по умолчанию closeAction из Ext.window.Window равно «уничтожить», что также уничтожит все дочерние компоненты. Либо измените closeAction на «скрыть», либо создайте новый экземпляр панели формы вместе с новым экземпляром окна.

person existdissolve    schedule 01.07.2013