1

私はExtJSコンボボックスを持っていますが、要件は、ユーザーが次のように最初の値からすべてのオプションを選択できる追加の値を持つことです。

Ext.onReady(function () {
    // The data store containing the list of states
    var states = Ext.create('Ext.data.Store', {
        fields: ['abbreviation', 'name'],
        data: [{
            name: 'Select all',
            abbreviation: 'ALL'
        },
        {
            name: 'ALABAMA',
            abbreviation: 'AL'
        }, {
            name: 'ALASKA',
            abbreviation: 'AK'
        }, {
            name: 'AMERICAN SAMOA',
            abbreviation: 'AS'
        }, {
            name: 'ARIZONA',
            abbreviation: 'AZ'
        }, {
            name: 'ARKANSAS',
            abbreviation: 'AR'
        }, {
            name: 'CALIFORNIA',
            abbreviation: 'CA'
        }, {
            name: 'COLORADO',
            abbreviation: 'CO'
        }, {
            name: 'CONNECTICUT',
            abbreviation: 'CT'
        }, {
            name: 'DELAWARE',
            abbreviation: 'DE'
        }, {
            name: 'DISTRICT OF COLUMBIA',
            abbreviation: 'DC'
        }, {
            name: 'FEDERATED STATES OF MICRONESIA',
            abbreviation: 'FM'
        }, {
            name: 'FLORIDA',
            abbreviation: 'FL'
        }, {
            name: 'GEORGIA',
            abbreviation: 'GA'
        }, {
            name: 'GUAM',
            abbreviation: 'GU'
        }, {
            name: 'HAWAII',
            abbreviation: 'HI'
        }, {
            name: 'IDAHO',
            abbreviation: 'ID'
        }, {
            name: 'ILLINOIS',
            abbreviation: 'IL'
        }, {
            name: 'INDIANA',
            abbreviation: 'IN'
        }, {
            name: 'IOWA',
            abbreviation: 'IA'
        }, {
            name: 'KANSAS',
            abbreviation: 'KS'
        }, {
            name: 'KENTUCKY',
            abbreviation: 'KY'
        }, {
            name: 'LOUISIANA',
            abbreviation: 'LA'
        }, {
            name: 'MAINE',
            abbreviation: 'ME'
        }, {
            name: 'MARSHALL ISLANDS',
            abbreviation: 'MH'
        }, {
            name: 'MARYLAND',
            abbreviation: 'MD'
        }, {
            name: 'MASSACHUSETTS',
            abbreviation: 'MA'
        }, {
            name: 'MICHIGAN',
            abbreviation: 'MI'
        }, {
            name: 'MINNESOTA',
            abbreviation: 'MN'
        }, {
            name: 'MISSISSIPPI',
            abbreviation: 'MS'
        }, {
            name: 'MISSOURI',
            abbreviation: 'MO'
        }, {
            name: 'MONTANA',
            abbreviation: 'MT'
        }, {
            name: 'NEBRASKA',
            abbreviation: 'NE'
        }, {
            name: 'NEVADA',
            abbreviation: 'NV'
        }, {
            name: 'NEW HAMPSHIRE',
            abbreviation: 'NH'
        }, {
            name: 'NEW JERSEY',
            abbreviation: 'NJ'
        }, {
            name: 'NEW MEXICO',
            abbreviation: 'NM'
        }, {
            name: 'NEW YORK',
            abbreviation: 'NY'
        }, {
            name: 'NORTH CAROLINA',
            abbreviation: 'NC'
        }, {
            name: 'NORTH DAKOTA',
            abbreviation: 'ND'
        }, {
            name: 'NORTHERN MARIANA ISLANDS',
            abbreviation: 'MP'
        }, {
            name: 'OHIO',
            abbreviation: 'OH'
        }, {
            name: 'OKLAHOMA',
            abbreviation: 'OK'
        }, {
            name: 'OREGON',
            abbreviation: 'OR'
        }, {
            name: 'PALAU',
            abbreviation: 'PW'
        }, {
            name: 'PENNSYLVANIA',
            abbreviation: 'PA'
        }, {
            name: 'PUERTO RICO',
            abbreviation: 'PR'
        }, {
            name: 'RHODE ISLAND',
            abbreviation: 'RI'
        }, {
            name: 'SOUTH CAROLINA',
            abbreviation: 'SC'
        }, {
            name: 'SOUTH DAKOTA',
            abbreviation: 'SD'
        }, {
            name: 'TENNESSEE',
            abbreviation: 'TN'
        }, {
            name: 'TEXAS',
            abbreviation: 'TX'
        }, {
            name: 'UTAH',
            abbreviation: 'UT'
        }, {
            name: 'VERMONT',
            abbreviation: 'VT'
        }, {
            name: 'VIRGIN ISLANDS',
            abbreviation: 'VI'
        }, {
            name: 'VIRGINIA',
            abbreviation: 'VA'
        }, {
            name: 'WASHINGTON',
            abbreviation: 'WA'
        }, {
            name: 'WEST VIRGINIA',
            abbreviation: 'WV'
        }, {
            name: 'WISCONSIN',
            abbreviation: 'WI'
        }, {
            name: 'WYOMING',
            abbreviation: 'WY'
        }]
    });

    Ext.define('comboSelectedCount', {
        alias: 'plugin.selectedCount',
        init: function (combo) {

            var fl = combo.getFieldLabel();

            combo.on({
                select: function (me, records) {

                    var len = records.length,
                        store = combo.getStore();

                    // toggle all selections
                    Ext.each(records, function (obj, i, recordsItself) {
                        if (records[i].data.abbreviation === 'ALL') {
                            len = store.getCount();
                            combo.select(store.getRange());
                        }
                    });

                    me.setFieldLabel(fl + ' (' + len + ' selected)');
                },
                beforedeselect: function (me, record, index) {
                    me.setFieldLabel(fl);
                }
            })
        }
    });

    // Create the combo box, attached to the states data store
    Ext.create('Ext.form.ComboBox', {
        disabled: false,
        plugins: ['selectedCount'],
        fieldLabel: 'Choose State',
        labelAlign: 'top',
        store: states,
        queryMode: 'local',
        editable: false,
        displayField: 'name',
        valueField: 'abbreviation',
        renderTo: Ext.getBody(),
        multiSelect: true,
        maxSelections: 3,
        width: 400,
        displayTpl: '<tpl for=".">' +
            '{name}' +
            '<tpl if="xindex < xcount">, </tpl>' +
            '</tpl>',
        listConfig: {
            itemTpl: '{name} <div class="chkbox"></div>'
        },
        listeners: {
        }
    });

});

ユーザーが「すべて選択」のチェックを外すか、「すべて選択」以外の項目を選択したときに、すべての選択を解除できるようにしたい。

これを行う方法を本当に理解できませんか?

JSFiddleはこちら:http ://jsfiddle.net/dFEsc/1/

4

3 に答える 3

5

コンボのストアに「すべて選択」アイテムを追加するのは悪い考えだと思います。プラグインはストアのデータに依存するようになります。ドロップダウンリストに追加してプラグインを編集し、トリガーを追加することをお勧めします。

afterrender: function () {
    combo.container.on({
        click: function(e) {
            var el = e.getTarget('div', 3, true);
            if(el.getAttribute('action') == 'select-all') {
                if( ! allSelected) {
                    combo.select(combo.getStore().getRange());
                    combo.setSelectedCount(combo.getStore().getRange().length);
                    el.setHTML('Deselect all...');
                    allSelected = true;
                }else{
                    combo.reset();
                    el.setHTML('Select all...');
                    allSelected = false;
                }
            }
        }
    })
}

Ext.each(records...-それはすべてナンセンスです..。

jsfiddleの完全な例を参照してください

アップデート:

また、フィールドにtplを追加することも、プラグインを追加するために任意のコンボボックスに追加するためのプラグインを作成する方が良いと思います。

プラグイン'init'関数:

Ext.apply(combo, {
    listConfig: {
        tpl : new Ext.XTemplate(
            '<div action="select-all" class="sel-all">Select all...</div><tpl for="."><div class="x-boundlist-item">{name} <div class="chkbox"></div></div></tpl>'
        )
    }
});

次に、listConfigを各コンボボックスについて説明する必要はありません。jsfiddleのリンクも更新されました。

Update2:

ツールバー付きのバリエーション:http://jsfiddle.net/dFEsc/16/

于 2013-02-15T13:57:30.760 に答える
2

[すべて選択]をクリックした後で他のいずれかをクリックしても、すべての選択が解除されないため、これは正確には要求されたものではありません。しかし、これはより一般的な動作だと思います。[すべて選択]を2回クリックすると、すべて選択を解除できます。

これがコードです(ちょっと汚いです。少し調整できると思います)

Ext.define('comboSelectedCount', {
    alias: 'plugin.selectedCount',
    init: function (combo) {

        var fl = combo.getFieldLabel();

        combo.on({
            select: function (me, records) {
                var len = records.length,
                    store = combo.getStore(),
                    diff = records.length != store.count,
                    newAll = false,
                    all = false,
                    newRecords = [];

                // toggle all selections
                Ext.each(records, function (obj, i, recordsItself) {
                    if (records[i].data.abbreviation === 'ALL') {
                        allRecord = records[i];
                        if (!combo.allSelected) {
                            len = store.getCount();
                            combo.select(store.getRange());
                            combo.allSelected = true;
                            all = true;
                            newAll = true;
                        } else {
                            all = true;
                        }
                    } else {
                        if (diff && !newAll)
                            newRecords.push(records[i]);
                    }

                });
                if (combo.allSelected && !all) {
                    combo.clearValue();
                    combo.allSelected = false;
                } else  if (diff && !newAll) {
                    combo.select(newRecords);
                    combo.allSelected = false;
                }

                me.setFieldLabel(fl + ' (' + len + ' selected)');
            },
            beforedeselect: function (me, record, index) {
                me.setFieldLabel(fl);
            }
        })
    }
});

JSFiddle

于 2013-02-15T08:51:24.070 に答える
2

//サーバーによってデータが読み込まれるコンボストアであり、グローバルストアです

      Ext.Ajax.request({
            url: '/myProject/api/teams',
            success: function (response, opts) {
                var responseObj = Ext.decode(response.responseText);
                var dataTeam = new Array();
                dataTeam[0] = new Array();
                dataTeam[0]['name'] = 'All';
                dataTeam[0]['value'] = -1;
                var j=0;
                for(var i=1; i<=responseObj.length; i++){
                    dataTeam[i] = new Array();
                    dataTeam[i]['name'] = responseObj[j].TEAMDESC;
                    dataTeam[i]['value'] = responseObj[j].TEAMID;
                    j++;
                }
                teamAllStore = Ext.create('Ext.data.Store', {
                    autoDestroy: false,
                    fields: ['name', 'value'],
                    data: dataTeam
                });
            }
        });

        //its my combo
       {
                    xtype: 'combo',
                    fieldLabel: 'Teams',
                    name: 'myTeam',
                    itemid: 'myTeam',
                    store: teamAllStore,
                    width:255,
                    labelWidth : 70,
                    displayField: 'name',
                    valueField: 'value',
                    queryMode: 'local',
                    mode: 'local',
                    emptyText:'Select Team',
                    triggerAction: 'all',
                    forceSelection: true,
                    allowBlank: false,
                    editable: true,
                    margins: '5 0 0 5',
                    myValue:0,  // initialized your variable..
                     multiSelect:true,
                     listConfig : {
                     getInnerTpl : function() {
                        return '<div class="chkCombo"> {name} </div>';
                        }
                     },
                     // this listeners for select all and de-select combo valuesall..
                     listeners: {
                        select: function (combo, eOpts) {

                                var store = combo.getStore();
                                if(combo.myValue==1){
                                     combo.reset();
                                    combo.myValue=0;
                                }
                                for (var i = 0; i < store.data.items.length; i++) {
                                    if(combo.value[i]==-1) {
                                        combo.myValue=1;
                                        combo.select(combo.getStore().collect(combo.valueField));
                                    }
                                }
                            }
                        }
                    }
于 2016-01-11T13:32:14.260 に答える