2

「変更」イベントのリスナーがあるコンボボックスで問題が発生しています。イベントが発生すると、2 番目のコンボボックスで使用可能な値をフィルター処理するために別のコンボボックスを強化するストアをフィルター処理する関数が実行されます。

アイデアは、最初のコンボボックスの短いリストから選択すると、2 番目のコンボボックスの選択肢が絞り込まれるというものです。

フォームが読み込まれると、2 番目のコンボボックスをクリックしてすべての選択肢を表示できます。これはうまく機能します。次に、最初のコンボボックスで何かを選択してから、2 番目のコンボボックスをもう一度クリックすると、適切な短縮リストが表示されますが、グレー表示され、「読み込み中...」が回転するだけで消えません。

フォームをロードして最初のコンボボックスで何かを選択してから 2 番目のコンボボックスをクリックすると、フィルタリングされて正常に表示されますが、最初のボックスで選択内容を変更してクリックすると、上記で説明したロードの問題が発生します。 2 番目のコンボボックスをもう一度。

以下のコードを参照してください。別の画面でこの設定を行っていますが、この問題はないようです。

次のように作成された ext ストアがあります。

var comboBreaker = Ext.create('Ext.data.Store', {
    autoLoad: false,
    remoteSort: true,
    remoteFilter: true,
    fields: [{
        name: 'id',
        mapping: 'item_id',
        type: 'int',
        useNull: false},
        'item_display_number','item_name', 'line_item_type_id', 'item_description'
    ],
    proxy:{
        type:'ajax',
        url: '/invoicer/data/getlineitems',
        reader: {
            type: 'json',
            successProperty: 'success',
            root: 'results',
            totalProperty: 'totalCount'
        },
        sorters:[{
            property:'item_display_number',
            direction:'ASC'
        }]
    }
});

このストアは、次のようにコンボボックスを強化します。

Ext.define('Writer.Form', {
    extend: 'Ext.form.Panel',
    alias: 'widget.writerform',

    requires: ['Ext.form.field.Text'],

    initComponent: function(){
        this.addEvents('create');
        Ext.apply(this, {
            activeRecord: null,
            frame: true,
            title: 'Line Item',
            id: 'writerform',
            fieldDefaults: {
                anchor: '100%',
                labelAlign: 'right'
            },
            items: [{
                xtype: 'combobox',
                fieldLabel: 'Item #',
                name: 'item_number',
                store: comboBreaker,
                displayField: 'item_display_number',
                valueField: 'id',
                allowBlank: false,
                forceSelection: true
            },{
                xtype: 'combobox',
                fieldLabel: 'Item Type',
                name: 'item_type',
                id: 'item_type',
                displayField: 'line_item_type',
                valueField: 'id',
                store: invoicer_lineItemTypeStore,
                forceSelection: true,
                labelWidth: 75,
                width: 200,
                listeners: {
                    change: {
                        fn: function() {
                            itemNumberFilter(comboBreaker);
                        }
                    }
                }
            }]
});

itemNumberFilter() 関数はストアを受け取り、それに対してフィルタリングを行います。そのコードは次のとおりです。

function itemNumberFilter( store ) {
    var id = Ext.getCmp('item_type').getValue();
    store.remoteFilter = false;
    store.clearFilter();
    if ( id ) {

        store.filter('line_item_type_id', id);
    }
    store.remoteFilter = true;
    store.removeAll();
    store.load({
        scope: this,
        callback: function( records ) {
            console.log('Loaded records!');
            console.log(records);
        }
    });
}

最初のコンボボックスで選択を変更するたびにログアウトされたレコードが表示され、2 番目のコンボボックスで結果を「見る」ことができますが、「ロード中..」GIF が表示されて常にグレー表示されます。

編集: ビデオの例: http://screencast.com/t/cUSHyFE6FIV

編集:これが解決策だと思います:

lastQuery: '',
listeners: {
                        beforequery: {
                            fn: function(query) {
                                delete this.lastQuery;
                            }
                        }
                    }

これをコンボボックス構成に追加すると、問題が修正されます。

Edit2:これによって導入された2番目のバグに遭遇しました。追加することで修正されました:

this.clearValue();

beforequery 関数 (上記で this.lastQuery を削除) に追加します。これにより、ドロップダウン矢印がクリックされるたびにコンボボックスの値がクリアされます。

4

2 に答える 2

0

xでアイテムを選択してから、で簡素化されたリストのcombo_1アイテムを選択するとします。次に、の選択をに変更します。これにより、のアイテムのリストが再び変更されます。でアイテムを選択した結果の新しいリストで利用できますか?コンボで使用できるリストにアイテムが存在しなくなったときに、アイテムを選択したままにしようとする問題である可能性があります。acombo_2combo_1ycombo_2acombo_2ycombo_1

combo_2フィルタを適用する前に、選択をクリアしてみましたか?

于 2012-04-21T01:08:03.887 に答える
0

2 番目のコンボボックスのストアを動的にロードできますが、2 番目のコンボボックスは必ず「ローカル」に設定してください。

于 2013-06-17T14:17:53.110 に答える