Форма extjs не отображается на панели при втором выборе

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

При первом выборе формы все в порядке, как только вы попытаетесь выбрать ее снова, ничего не отображается.

Демонстрация доступна здесь, а в верхней части страницы есть ссылка на javascript.

http://www.somethingorothersoft.com/ext

Выбор компонента происходит в функции selectNode, и я пробовал все, что мог, без особого результата.

Редактировать, как указал Джим Бэрроуз, было бы лучше создать экземпляр компонента в функции создания. Я не решался сделать это, так как это довольно серьезное изменение в моем реальном приложении, и я хотел на самом деле сохранить экземпляры для облегчения навигации между ними.

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

Редактировать Я внес изменение, чтобы всегда создавать экземпляры форм таким образом, теперь это намного больше extJSy :) :

components['Form1'] = { xtype:'form', "items": [
 { "name": "Rep_ID", "allowBlank": false, "fieldLabel": "Rep" },
 { "name": "Date", "allowBlank": false, "fieldLabel": "Date", "xtype": "datefield" },
 { "name": "Time", "allowBlank": true, "fieldLabel": "Time", "xtype": "timefield"}],
 "defaults": { "xtype": "textfield" }
};

components['Form2'] = { xtype: 'form', "items": [
 { "name": "Date", "allowBlank": false, "fieldLabel": "Date", "xtype": "datefield" },
 { "name": "Time", "allowBlank": true, "fieldLabel": "Time", "xtype": "timefield"}],
 "defaults": { "xtype": "textfield" }
}

person Igor Zevaka    schedule 27.10.2009    source источник


Ответы (1)


Ваша проблема здесь:

var selectNode = function(node) {

    node.select();
    node = node.attributes;
    var newpanel = components[node.component].create();
    var cp = Ext.ComponentMgr.get('center_panel');
    cp.setTitle(node.text, node.icon);

    newpanel.hideMode = 'visibility';
    newpanel.hide();
    cp.removeAll();
    cp.add(newpanel);
    cp.doLayout();
    newpanel.show();
};

и тут:

create: function() { return this; } 

cp.removeAll() действительно уничтожает все компоненты. Поэтому, когда вызывается create, this не возвращается, поэтому ничего не отображается. Компонент окна просмотра автоматически уничтожает все удаленное, и панель наследует эту функциональность. Вы можете либо установить для autoDestory значение false, либо создать новый внутри файла create.

person Jim Barrows    schedule 27.10.2009
comment
Это не совсем так, но на один шаг ближе к решению. return this всегда возвращает допустимый объект, но его состояние каким-то образом испорчено. Если я установлю для autoDestroy значение false, у меня все равно возникнет проблема, просто вместо того, чтобы форма не отображалась, это будет последняя форма, которая была отображена в первый раз. - person Igor Zevaka; 28.10.2009