0

我有一个我真的无法解决的问题。这是我的目标:我想将 Tab 动态添加到TabPanel. 我创建了我自己的组件EmpruntsTabPanel() ,当我创建它时,我只需要提供一个数组并EmpruntsTabPanel()创建 count(array)) 选项卡。这完美地工作。所以我做了另一个组件,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);
    }
});
4

1 回答 1

0

初始加载的代码在哪里?

console.log( res.data.emprunts );你声明之前这是var res = action.result;正确的吗?(您可能在日志中看不到真实结果)

在高层次上,如果某些东西在加载时按预期工作,但在所有内容渲染后没有,我会看看在form/container .doLayout()从表单中删除/添加魔法后是否需要调用。

让我知道这是否有帮助。

于 2011-04-05T17:07:58.247 回答