Компонент ExtJS, FormPanel и TabPanel: сообщение не отправляет все поля

Вот моя проблема: пока вкладки не отображаются, данные, содержащиеся на вкладках, не отправляются. Если я нажимаю на вкладку, данные добавляются в "стек" и отправляются через событие публикации. (См. код) Чего я не понимаю, так это того, что я использую «deferredRender: false». Кажется, это единственное, что можно использовать для «принудительного» расчета поля. Я не вижу, чего мне не хватает, но я что-то упускаю. Может кто-нибудь помочь мне?

Большое спасибо.

Вот полный исходный код (который работает) класса DossierPanel:

DossierPanel = Ext.extend(Ext.form.FormPanel, {
    closable: true,
    autoScroll:true,

    initComponent : function(){
        var n = this.id_dossier;
        if (this.nom) {
            n += ' '+this.nom
        }
        if (this.prenom) {
            n += ' '+this.prenom;
        }
        this.title = n;
        this.id = 'id_dossier_'+this.id_dossier;
        this.bodyStyle = 'padding:15px';
        this.labelWidth = 150;
        this.items = [{
            layout:'column',
            border:false,
            autoHeight: true,
            items:[{
                columnWidth:.5,
                layout: 'form',
                border:false,
                items: [{
                    xtype:'textfield',
                    fieldLabel: 'Civilite ',
                    name: 'CIVILITE',
                    readOnly: true
                }, {
                    xtype:'textfield',
                    fieldLabel: 'Nom ',
                    name: 'NOM',
                    anchor:'95%'
                }, {
                    xtype:'textfield',
                    fieldLabel: 'Prenom ',
                    name: 'PRENOM',
                    anchor:'95%'
                }]
            },{

                columnWidth:.5,
                layout: 'form',
                border:false,
                items: [{
                    xtype:'textfield',
                    fieldLabel: 'RaisonSociale ',
                    name: 'RAISONSOCIALE',
                    anchor:'95%'
                },{
                    xtype:'textfield',
                    fieldLabel: 'Email ',
                    name: 'EMAIL',
                    vtype:'email',
                    anchor:'95%'
                }]
            }]
        },{
            xtype:'tabpanel',
            plain:true,
            activeTab: 0,
            /* (!) For a tab to force calculation, I use
             * deferredRender: false
             * It's very important for Form with multiple Tabs
             */
            deferredRender: false,
            defaults:{bodyStyle:'padding:10px'},
            items:[{
                title:'Détails personnels',
                layout:'form',
                autoHeight: true,
                defaults: {width: '99%'},
                defaultType: 'textfield',

                items: [{
                    fieldLabel: 'Poids ',
                    name: 'POIDS',
                    readOnly: true
                }, {
                    xtype:'datefield',
                    fieldLabel: 'Date premier contact ',
                    name: 'DATE1ERCONTACTJMA',
                    readOnly: true,
                    format:'d/m/Y'
                }, {
                    xtype:'datefield',
                    fieldLabel: 'Date étude dossier ',
                    name: 'DATEDATE_ETUDE_DOSSIERJMA',
                    format:'d/m/Y'
                }]
            },{
                title:'Adresse',
                layout:'form',
                autoHeight: true,
                defaults: {width: '95%'},
                defaultType: 'textfield',
                items: [{
                    fieldLabel: 'Adresse 1 ',
                    name: 'ADRESSE1'
                }, {
                    fieldLabel: 'Pays ',
                    name: 'PAYS',
                    readOnly: true
                }]
            },{
                title:'Téléphone(s)',
                layout:'form',
                autoHeight: true,
                defaults: {width: 230},
                defaultType: 'textfield',
                items: [{
                    fieldLabel: 'NoTelephone2 ',
                    name: 'NOTELEPHONE2',
                }, {
                    fieldLabel: 'DescTelephone3 ',
                    name: 'DESCTELEPHONE3',
                    readOnly: true
                }, {
                    fieldLabel: 'NoTelephone3 ',
                    name: 'NOTELEPHONE3',
                }]
            },{
                title:'Divers',
                layout:'form',
                autoHeight: true,
                defaults: {width: 230},
                defaultType: 'textfield',
                items: [{
                    fieldLabel: 'Mot de passe Internet ',
                    name: 'MOTDEPASSE'
                }, {
                    fieldLabel: 'Parts ',
                    name: 'PARTS'
                }, {
                    fieldLabel: 'Commission ',
                    name: 'COMMISSION'
                }]
            },{
                id: 'tab_emprunts_'+this.id_dossier,
                title:'Emprunts',
                layout:'form',
                autoHeight: true,

                defaults: {width: '99%'},
                defaultType: 'textfield',
                items: []
            }]
        }];
        this.buttonAlign = 'left';
        this.buttons = [{
            text: 'Recharger',
            handler: function() {
                this.getForm().load( {
                  url: '/ws/cellulemedicale/jsonEditDossier.php',
                  params: {
                      id_dossier: this.id_dossier
                  },
                  waitTitle: 'Wait',
                  waitMsg: 'Refresh',
                  failure:function(form, action) {
                        globGestionErreurAjax(action.response,'Refresh error');
                  }
                });
            },
            scope: this
        },{
            text: 'Sauver',
            handler: function() {
                this.getForm().submit({
                    url: '/ws/cellulemedicale/jsonEditDossier.php',
                    params: {
                        write: 1,
                        id: this.id_dossier
                    },
                    waitTitle: 'Wait...',
                    waitMsg: 'Saving',
                    success: function (form, action) {
                      var b = Ext.util.JSON.decode(action.response.responseText);
                      if (b.success==true) {
                          if (b.msg) {
                              Ext.MessageBox.alert('Done!', b.msg);
                          }
                          else {
                              Ext.MessageBox.alert('Done!', 'Saved ok');
                          }
                      }
                    },
                    failure:function(form, action) {
                        globGestionErreurAjax(action.response,'Save error');
                    }
                });
            },
            scope: this
        }];
        this.on('actioncomplete', function (form,action) {
            if (action.type=='load') {
                console.log(action.result.data.emprunts);
                if(typeof action.result != 'undefined') {
                    if(typeof action.result.data != 'undefined') {
                        if(typeof action.result.data.emprunts != 'undefined') {
                            /* For now, use the id, this may be ugly:
                             */
                            var tab = Ext.getCmp('tab_emprunts_'+this.id_dossier);
                            tab.removeAll(true);
                            var nt = new EmpruntsPanel(action.result.data.emprunts);
                            tab.add(nt);
                        }
                    }

                    }
                }
            }
        });

        DossierPanel.superclass.initComponent.call(this);
        console.log(this.events)
    }
});

person Olivier Pons    schedule 05.04.2011    source источник
comment
Можете ли вы опубликовать фиктивный рабочий пример?   -  person JamesHalsall    schedule 06.04.2011
comment
Извините, я не могу опубликовать рабочий пример, потому что он находится в исходном коде JavaScript ~ 3000.   -  person Olivier Pons    schedule 03.05.2011


Ответы (3)


как насчет добавления свойства конфигурации forceLayout: true на каждую из вкладок или на саму панель вкладок?

Я надеюсь, что это приведет к вычислению полей.

person shane87    schedule 07.04.2011

Я думаю, вам нужно включить

defaults: { hideMode: 'offsets' }

на панели вкладок.

person Chris    schedule 02.05.2011

Я думаю, вам нужно установить Dirty = true

{ xtype: 'textfield', name: 'name' ,readOnly:true ,submitValue: true ,isDirty: function() { return true;} }

person betasux    schedule 07.09.2011