【问题标题】:MultiSelect in extjs Comboboxextjs组合框中的多选
【发布时间】:2017-03-17 10:45:00
【问题描述】:

我试图在 Extjs 的组合框中进行多选,在我选择 Items 后,tpl 索引被渲染,想要渲染离开单元格时选择的显示字段的值,我怎样才能实现这个。

这是代码

function run() {

    var myStore=Ext.create('Ext.data.Store', {
        storeId: 'simpsonsStore',
        fields: ['busname', 'time', 'typebus',],
        pageSize:2,
        proxy: {
           type: 'memory',
          enablePaging: true
    },
        data: [{
            busname: 'ABCD',
            time: '15:30:00',
            typebus: 'AC Volvo',

        }, {
            busname: 'aaa',
            time: '13:30:00',
            typebus: 'Seater',

        },{
            busname: 'AAAA',
            time: '18:30:00',
            typebus: 'Sleeper',

        },{
            busname: 'ABCD',
            time: '19:30:00',
            typebus: 'AC Volvo',

        },]
    });

    Ext.create('Ext.grid.Panel', {
        xtype :'gridpanel',
        itemId:'busTimegrid',
        pageSize:1,
        title: 'BUS DEATILS',
        mapperId:'getBusTime',
        store: Ext.data.StoreManager.lookup('simpsonsStore'),
        columns: [{
            header: 'Bus Name',
            dataIndex: 'busname',
            editor: 'textfield'
        }, {
            text: 'Bus Time',
                dataIndex: 'time',
            xtype: 'gridcolumn',
            renderer: function (value) {
                if (value instanceof Date)
                    return Ext.util.Format.date(value, 'H:i:s');
                else
                return value;
            },
            flex: 1,
            editor: {
                xtype: 'timefield',
                format: 'H:i:s',
                allowBlank: true,
                maskRe: /[0-9,:]/,
                listeners: {
                beforeselect: function(timefield, record) {
                var grid = timefield.up('grid');
                if(grid.store.find('time', record.data.disp) != -1) {
                Ext.Msg.alert("Bus time already exist.");
                return false;
    }
  }
}
            }
        }, {
            header: 'Bus TYpe',
            dataIndex: 'typebus',
            editable:true,
            renderer: function (value) {
                if (Ext.isNumber(value)) {
                    var store = this.getEditor().getStore();
                    return store.findRecord('id', value).get('name');
                }
                return value;
            },
            editor: {
                xtype: 'combo',
                displayField: 'name',
                valueField: 'id',
                editable:true,
                forceSelection:true,
                multiSelect: true,
                    displayTpl: '<tpl for=".">' +
                    '{name}' +
                    '<tpl if="xindex < xcount">, </tpl>' +
                    '</tpl>',
                store: Ext.create('Ext.data.Store', {
                    fields: ['id', 'name'],
                    data: [{
                        id: 1,
                        name: 'AC Volvo'
                    }, {
                        id: 2,
                        name: 'Seater'
                    }, {
                        id: 3,
                        name: 'Sleeper'
                    }]
                })

            }
        }],
        selModel: 'cellmodel',
        plugins: {
            ptype: 'cellediting',
            clicksToEdit: 1,
        },
        listners: [{
            fn: 'onUsernamefieldBlur',
            event: 'blur',
            delegate: 'busname'
        }],
        onUsernamefieldBlur: function (textfield, e, eOpts) {

        if (textfield.getValue() === '') {
            Ext.Msg.alert("Busname can't be empty");
            textfield.setFocus(true);
        }
    },
        height: 200,
        width: 400,
            dockedItems: [{
            xtype: 'pagingtoolbar',
            store: myStore,   // same store GridPanel is using
            dock: 'bottom',
            displayInfo: true
        }],
        renderTo: Ext.getBody()

    });
    var gridRow = myStore.getModifiedRecords();
 Ext.each(gridRows, function (gridRow) {
     var dirtyInd = myStore.indexOf(gridRow);
     var newTime = new Date(store.getAt(dirtyInd).data.time);
   },
   myStore.each(function (record, idx) {
   var newT = new Date(record.get('time'));
   if (Ext.Date.diff(newTime, newT,Ext.Date.SECOND)=== 0)
   {
   samebustime = true;
   }
   })); 
   if(samebustime){
       Ext.Msg.alert('Warning','Same time occured')
   }
}

Fiddle

【问题讨论】:

  • 你真的需要typebus的id吗?如果没有,那么valueField: 'name' 将为您工作。
  • 是的,因为当使用远程存储时,我需要将该数据存储在数据库中..

标签: combobox multi-select


【解决方案1】:

我对您的原始源代码进行了一些修改。你可能喜欢或不喜欢。但是在这段代码中,你得到了你所要求的。我不确定这是否正是您想要的。

Ext.application({
    name: 'Fiddle',

    launch: function () {
        run();
        window.show();
    }
});


function run() {

    var myStore = Ext.create('Ext.data.Store', {
        storeId: 'simpsonsStore',
        fields: ['busname', 'time', 'typebus',],
        pageSize: 2,
        proxy: {
            type: 'memory',
            enablePaging: true
        },
        data: [{
            busname: 'ABCD',
            time: '15:30:00',
            typebus: 'AC Volvo',

        }, {
            busname: 'aaa',
            time: '13:30:00',
            typebus: 'Seater',

        }, {
            busname: 'AAAA',
            time: '18:30:00',
            typebus: 'Sleeper',

        }, {
            busname: 'ABCD',
            time: '19:30:00',
            typebus: 'AC Volvo',

        },]
    });

    var typebusStore = Ext.create('Ext.data.Store', {
        storeId: 'typeBusStore',
        fields: ['id', 'name'],
        data: [{
            id: 1,
            name: 'AC Volvo'
        }, {
            id: 2,
            name: 'Seater'
        }, {
            id: 3,
            name: 'Sleeper'
        }]
    })

    Ext.create('Ext.grid.Panel', {
        xtype: 'gridpanel',
        itemId: 'busTimegrid',
        pageSize: 1,
        title: 'BUS DEATILS',
        mapperId: 'getBusTime',
        store: Ext.data.StoreManager.lookup('simpsonsStore'),
        columns: [{
            header: 'Bus Name',
            dataIndex: 'busname',
            editor: 'textfield'
        }, {
            text: 'Bus Time',
            dataIndex: 'time',
            xtype: 'gridcolumn',
            renderer: function (value) {
                if (value instanceof Date)
                    return Ext.util.Format.date(value, 'H:i:s');
                else
                    return value;
            },
            flex: 1,
            editor: {
                xtype: 'timefield',
                format: 'H:i:s',
                allowBlank: true,
                maskRe: /[0-9,:]/,
                listeners: {
                    beforeselect: function (timefield, record) {
                        var grid = timefield.up('grid');
                        if (grid.store.find('time', record.data.disp) != -1) {
                            Ext.Msg.alert("Bus time already exist.");
                            return false;
                        }
                    }
                }
            }
        }, {
            header: 'Bus TYpe',
            dataIndex: 'typebus',
            editable: true,
            renderer: function (value, md, record) {
                var retValue = Array();
                if (Ext.isArray(value)) {
                    Ext.each(value, function(id) {
                        retValue.push(Ext.data.StoreManager.lookup('typeBusStore').findRecord('id', id).get('name'));
                    });
                }

                if (retValue.length > 0) {
                    return retValue.join(", ");
                }
                return value;
            },
            editor: {
                xtype: 'combo',
                displayField: 'name',
                valueField: 'id',
                editable: true,
                forceSelection: true,
                multiSelect: true,
                displayTpl: '<tpl for=".">' +
                '{name}' +
                '<tpl if="xindex < xcount">, </tpl>' +
                '</tpl>',
                store: typebusStore

            }
        }],
        selModel: 'cellmodel',
        plugins: {
            ptype: 'cellediting',
            clicksToEdit: 1,
        },
        listners: [{
            fn: 'onUsernamefieldBlur',
            event: 'blur',
            delegate: 'busname'
        }],
        onUsernamefieldBlur: function (textfield, e, eOpts) {

            if (textfield.getValue() === '') {
                Ext.Msg.alert("Busname can't be empty");
                textfield.setFocus(true);
            }
        },
        height: 200,
        width: 400,
        dockedItems: [{
            xtype: 'pagingtoolbar',
            store: myStore,   // same store GridPanel is using
            dock: 'bottom',
            displayInfo: true
        }],
        renderTo: Ext.getBody()

    });
    var gridRows = myStore.getModifiedRecords();
    console.log(gridRows)
    var samebustime = false;
    Ext.each(gridRows, function (gridRow) {
        var dirtyInd = myStore.indexOf(gridRow);
        var newTime = new Date(store.getAt(dirtyInd).data.time);

        myStore.each(function (record, idx) {
            var newT = new Date(record.get('time'));
            if (Ext.Date.diff(newTime, newT, Ext.Date.SECOND) === 0) {
                samebustime = true;
            }
        })
    });
    if (samebustime) {
        Ext.Msg.alert('Warning', 'Same time occured')
    }
}

Fiddle

【讨论】:

  • 这对静态存储非常有效,迷人,.. 现在我尝试远程加载组合框,所以我尝试使用 var store = this.getEditor().getStore 加载存储,但它说就像 this.getEditor 是不是函数,但是我在不同的函数中使用了相同的函数,它完美地工作,你能说我哪里出错了
  • 您的this 似乎是gridpanel。您需要在特定网格中才能获得其编辑器。大致执行this.columns[2].getEditor().getStore() 将获得总线类型编辑器的存储。
  • 如何在编辑器中指定远程存储,在某种意义上,例如:我没有定义 typeBustore,我在 mapperId 的帮助下使用查询获取数据,所以使用该映射器id a store will be created ..... 如何在编辑器中提及远程商店,如store: 'something'
  • 您的这似乎是网格面板。您需要在特定的网格中 _获取它的编辑器。粗略地做 this.columns[2].getEditor().getStore() 将_让你存储总线类型编辑器.......当我使用 thios 并在控制台中打印 retValue 时我一个错误的值..不是正确的值,它给了我其他列值
  • 如果您在小提琴中提供的这个示例中尝试,您将获得正确的商店,我已经在小提琴中对其进行了测试并为您提供了答案。您是否像使用您正在执行的代码或我在答案中提供的小提琴中的代码一样检查了这一点?
猜你喜欢
  • 2012-06-29
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多