代码之家  ›  专栏  ›  技术社区  ›  Igor Zevaka

第二次选择ExtJS窗体时,它不会在面板中呈现

  •  0
  • Igor Zevaka  · 技术社区  · 15 年前

    我有一个基本的布局,可以使用树视图选择不同的组件,然后在主面板中进行渲染。这对于我的所有组件(如网格)都很好,但是表单会出现问题。

    第一次选择窗体是可以的,只要再次尝试选择它,就不会呈现任何内容。

    演示在这里可用,页面顶部有一个指向javascript的链接。

    http://www.somethingorothersoft.com/ext

    组件的选择是在selectnode函数中进行的,我已经尽了最大努力,但没有太多结果。

    编辑 正如JimBarrows指出的那样,最好在create函数中实例化一个组件。我一直在犹豫是否要这样做,因为这是我真正的应用程序中的一个相当大的变化,我想把实例放在身边,以便在它们之间导航。

    既然我已经写了这篇文章,我意识到要正确地执行状态,我必须将它存储在服务器上,而不管浏览器是否导航到另一个页面…

    编辑 我做了这样的更改,以始终实例化表单,现在更进一步:):

    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" }
    }
    
    1 回复  |  直到 15 年前
        1
  •  0
  •   Jim Barrows    15 年前

    你的问题在这里:

    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时,没有要返回的这个,所以不会显示任何内容。视区组件会自动销毁删除的任何内容,面板会继承此功能。您可以将autodestory设置为false,也可以在create中执行新的操作。