ExtJS и FormPanel: повторная загрузка не работает (проходит через тот же код) - PullRequest
0 голосов
/ 05 апреля 2011

У меня есть проблема, которую я действительно не могу решить.Вот моя цель: я хочу динамически добавлять вкладки в TabPanel.Я создал свой собственный компонент с именем EmpruntsTabPanel(), и когда я его создаю, мне просто нужно дать массив, а EmpruntsTabPanel() создает счетчик (массив).Это работает отлично.Итак, я сделал еще один компонент, DossierPanel.

Этот, после загрузки , создает динамически EmpruntsTabPanel().Это работает отлично.ОшибатьсяЭто отлично работает * в первый раз он загружен.Я сделал кнопку для повторной загрузки DossierPanel (см. Код ниже).Я называю точно кодом того же (потому что он в том же событии), и я проверил: это тот же URL, и результат тот же.Итак:

  1. почему это работает в первый раз, если reload нет?
  2. на противоположном, если это работает в первый раз, почему нет во второй раз?

Может быть, это как-то связано с кодом

            var res = action.result;
            var tab = Ext.getCmp('tab_emprunts_'+this.id_dossier);
            tab.removeAll(true);
            tab.add( new EmpruntsTabPanel( res.data.emprunts ) );

Вот мой компонент (я удалил много textfield компонентов дляясность):

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

    initComponent : function(){
        var n = this.id_dossier;
        this.title = n;
        this.id = 'id_dossier_'+this.id_dossier;
        this.bodyStyle = 'padding:15px';
        this.labelWidth = 150;
        this.items = [{
            xtype:'tabpanel',
            plain:true,
            activeTab: 0,
            /* (!) Pour qu'un onglet qui n'est pas affiché soit
             * quand même calculé, il faut faire :
             * deferredRender: false
             * C'est très important lorsqu'on fait des fiches
             * avec plusieurs onglets.
             */
            deferredRender: false,
            defaults:{bodyStyle:'padding:10px'},
            items:[{
                title:'Détails personnels',
                layout:'form',
                autoHeight: true,
                defaults: {width: '99%'},
                defaultType: 'textfield',
                items: [{
                    xtype:'datefield',
                    fieldLabel: 'Date premier contact ',
                    name: 'DATE1ERCONTACTJMA',
                    readOnly: true,
                    format:'d/m/Y'
                }]
            },{
                title:'Adresse',
                layout:'form',
                autoHeight: true,
                defaults: {width: '95%'},
                defaultType: 'textfield',
                items: [{
                    fieldLabel: 'Adresse 1 ',
                    name: 'ADRESSE1'
                }]
            },{
                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: 'Patientez',
                  waitMsg: 'Rafraichissement',
                  failure:function(form, action) {

                  },
                  scope: this
                } );
            },
            scope: this
        }];
        this.on('actioncomplete', function (form,action) {
            if (action.type=='load') {
                if(typeof action.result != 'undefined') {
                    console.log( 'load finished' );
                    console.log( res.data.emprunts );
                    var res = action.result;
                    var tab = Ext.getCmp('tab_emprunts_'+this.id_dossier);
                    tab.removeAll(true);
                    tab.add( new EmpruntsTabPanel( res.data.emprunts ) );
                }
            }
        });

        DossierPanel.superclass.initComponent.call(this);
    }
});

1 Ответ

0 голосов
/ 05 апреля 2011

Где находится код, который выполняет начальную загрузку?

console.log( res.data.emprunts ); равно до , которое вы объявляете var res = action.result; Это правильно? (Возможно, вы не видите истинный результат в журнале)

На высоком уровне, если что-то работает, как и ожидалось, при загрузке, но не после того, как все рендерится, я бы посмотрел, нужно ли мне вызывать form/container .doLayout() после выполнения магии удаления / добавления из формы.

Дайте мне знать, если это поможет.

...