extjs4如何多次显示字段

时间:2014-10-14 10:29:31

标签: javascript forms extjs combobox fieldset

我有一个extjs表单面板。根据组合框中选择的值,我需要多次显示一个字段集。也就是说,如果选择的值为1,则显示一次设置字段;如果选择的值为2,则显示两次。

我面临的问题是,字段集只显示一次。因为,我正在更改字段集的标题,我可以更清楚地告诉显示的字段集是for循环的最后一次迭代中的字段集。

但是,我可以在js控制台中看到for循环的所有迭代的日志消息,这意味着循环正在正确执行。

这是我的代码:

 Ext.define('ELM.view.cl.Edit', {
    extend : 'Ext.form.Panel',
    alias : 'widget.cform',
    addMode : false,
    layout : 'fit',
    autoShow : true,
    initComponent : function() {
        this.items = this.buildItems();
        this.callParent(arguments);
    },
    buildItems : function() {
        return [ {
            xtype : 'form',
            id : 'details',
            items : [
                    {
                    xtype : 'fieldset',
                    columnWidth : 0.5,
                    title : 'Details',
                    items : [
                            {
                                    fieldLabel : 'Number Of Scripts Required',
                                    xtype : 'combo',
                                    name : 'noOfScriptsRequired',
                                    id : 'noOfScriptsRequired',
                                    store : new Ext.data.SimpleStore({
                                    fields : [ 'no', 'val' ],
                                    data : [['1','1'],['2','2'],['3','3']]
                                    }),
                                    displayField : 'no',
                                    valueField : 'val',
                                    listeners : {
                                        select : function(combo, value) {
                                            var formpanel = Ext.widget('cform');
                                            var sd = this.up('form').getComponent(
                                                            'scriptdetails');
                                            for ( var i=1; i<=combo.getValue();i++){
                                                console.log(i);
                                                var title="Script details "+i;
                                                sd.setTitle(title);
                                                sd.show();
                                                sd.hidden = false;
                                                console.log(sd);
                                            }
                                        }
                                    }
                                }, ]
                    }, {
                        xtype : 'fieldset',
                        id : 'scriptdetails',
                        columnWidth : '0.5',
                        hidden : true,
                        title : 'Script Details',
                        items : [ {
                            xtype : 'textfield',
                            fieldLabel : 'Script Name',
                            name : 'scriptName'
                        } ]
                    }

            ]
        } ];
    }

});

更新:以下是工作代码:

{
    fieldLabel : 'Name :',
    xtype : 'textfield',
    name : 'name'
},{
    fieldLabel : 'Number Of Scripts Required',
    xtype : 'combo',
    name : 'noOfScriptsRequired',
    id : 'noOfScriptsRequired',
    store : new Ext.data.SimpleStore({
        fields : [ 'no', 'val' ],
        data : [ [ '1', '1' ],  [ '2', '2' ],[ '3', '3' ] ]
        }),
    displayField : 'no',
    valueField : 'val',
    listeners : {
        select : function(combo, value) {
            var dynamicPanel = Ext.getCmp("dynamicPanel");
            var scriptField = {
                xtype : 'fieldset',
                items : [
                    {
                    xtype : 'textfield',
                    fieldLabel : 'Script Name',
                    name : 'scriptName'
                    },
                    {
                    xtype : 'textfield',
                    fieldLabel : 'Script Parameters',
                    name : 'scriptParameters'
                    } ]
                    };
            dynamicPanel.removeAll(true);
            for ( var i = 0; i < combo.getValue(); i++) {
                var index = dynamicPanel.items.length;
                var j = i + 1;
                scriptField.title = "Script Details "+ j;
                dynamicPanel.insert(index,scriptField);
                dynamicPanel.doLayout();
            }
        }
        }

提前致谢

2 个答案:

答案 0 :(得分:1)

您在fieldset中使用id:'scriptdetails'。在网页中,每个组件或元素都应具有唯一的ID。如果存在具有相同id的元素,则在渲染元素时会出现问题,例如单个元素呈现错误或元素可能无法呈现。

在您需要重复字段集的情况下,请勿使用固定ID。使用服务器中随机生成的id或使用ExtJS提供的“itemId”。

参考:herehere

<强>更新 工作小提琴是here

Ext.onReady(function() {

    var store = new Ext.data.ArrayStore({
        id: 0,
        fields: [
            'myId',
            'displayText'
        ],
        data: [
            [1, '1'],
            [2, '2'],
            [3, '3'],
        ]
    });

    var scriptField = {
        xtype: 'fieldset',
        columnWidth: '0.5',
        title: 'Script Details',
        items: [{
            xtype: 'textfield',
            fieldLabel: 'Script Name',
            hiddenName: 'scriptName'
        }]
    };

    var container = new Ext.Panel({
        layout: 'hbox',
        height: '700px',
        items: [{
            xtype: 'panel',
            id: 'parentContainer',
            height: '700px',
            layout: 'form',
            items: [{
                xtype: 'combo',
                editable: false,
                triggerAction: 'all',
                mode: 'local',
                store: store,
                valueField: 'myId',
                displayField: 'displayText',
                fieldLabel: 'Show Number of Items',
                listeners: {
                    select: function(combo, value) {
                        var dynamicPanel = Ext.getCmp("dynamicPanel");
                        dynamicPanel.removeAll(true);
                        for (var i = 0; i < combo.getValue(); i++) {
                            scriptField.title = "Script Details " + i;
                            dynamicPanel.add(scriptField);
                            dynamicPanel.doLayout();
                            dynamicPanel.ownerCt.doLayout();
                            dynamicPanel.ownerCt.ownerCt.doLayout();
                        }
                    }
                }
            }, {
                xtype: 'panel',
                id: 'dynamicPanel',
                items: []
            }]
        }]
    });

    container.render(Ext.getBody());

});

答案 1 :(得分:1)

您的buildItems代码在开头执行一次。之后,你永远不会真正添加任何项目。您希望使用此功能执行此操作:http://docs.sencha.com/extjs/4.2.2/#!/api/Ext.container.AbstractContainer-method-add

如果要添加项目,则必须创建一个新项目。您不能将同一项添加到容器中两次。因此,您必须动态创建它们:http://docs.sencha.com/extjs/4.2.2/#!/api/Ext-method-create

为此,您应该使用一些已定义的&#34; blueprint&#34;,您可以在其中定义它是一个字段集,包含一个文本字段,依此类推:http://docs.sencha.com/extjs/4.2.2/#!/api/Ext-method-define

项目的蓝图不应包含id。我会使用form.items[i]来引用所有项目,并完全省略id。

但是仍然存在一个问题:您的项目都包含相同名称的文本字段。这对submit()很有用。但这完全是另一个故事。