web-dev-qa-db-ja.com

ストアをExtJS 4のコンボボックスにロードするときに追加のパラメーターを送信する方法は?

ExtJS 4でコンボボックスのストアを使用するときに、追加のパラメーターを送信するにはどうすればよいですか?

プロキシ設定で「extraParams」を使用できることはわかっていますが、同じストアを使用しているすべての要素に影響します。

つまり、システム内のすべてのユーザーを一覧表示する「ユーザー」というストアを使用しているグリッドがある場合。同時に、ストア「Users」も使用するコンボボックスがありますが、今回は「status = 2」を持つすべてのユーザーをリストしたいので、パラメーター「&status = 2」をバックエンドへのAjax呼び出し。

私が次のようなものを使用する場合:

store.getProxy().extraParams = {
  status: 2
};

グリッドは機能しますが、グリッドは同時に「&status = 2」を使用するように更新されます。私はコンボボックスでパラメーターを使用したいだけです。

グリッドで「autoupdate」をオフにして、コンボボックスの「render」イベントに「extraParams」を設定し、コンボボックスが非表示になったときに設定を解除できると思いますが、非常に醜い解決策になります。

ストアを「Users2」に複製して、それをコンボボックスに使用することもできますが、これも醜い解決策です。

これを行う正しい方法は何ですか?それはほとんどの人にとって非常に一般的なものでなければなりません。

更新1:

私は次のようなものを使用できることを知っています:

store.load({
  params:{
    'foo1': bar1,
    'foo2': bar2
  } 
});

しかし、ExtJS 4 MVCでそれをどのように使用しますか?そこでは、フォームオブジェクトで "store:Users"を指定するだけです。これらの追加パラメーターを.load()関数に送信するにはどうすればよいですか?

私は以下を試しました:

{
xtype: 'combobox',
fieldLabel: 'Server',
name: 'server',

//store: 'ServersIP',
store: new Cloud.store.ServersIP(),

/*
listeners: {
    beforeload: function(store, options) {
        console.log(store);
    }
},
*/

valueField: 'id',
displayField: 'name_id',
emptyText: 'Select a Server...',
editable: false
},

ただし、「Uncaught TypeError:未定義のプロパティ 'ServersIP'を読み取れません」というエラーが発生します。

しかし、名前は正しいです:

Ext.define('Cloud.store.ServersIP', {

extend: 'Ext.data.Store',
model: 'Cloud.model.Server', 

また、リスナーを正確にどこに配置しますか?私の例でも正しいものを取得できなかったと思いますか?

更新2:

私は今解決策をもう少し持っています:

store: Ext.create('Cloud.store.ServersIP', {
proxy: {
    extraParams: {
        param1: 'value1',
        param2: 'value2'
    }
},                          
}),

上記は機能しません。 Ext.Createのパラメーターに「1レベル」の変数しかない場合に機能します。何らかの理由で、proxy => extraParams => param1を渡すと気に入らない。

これはうまくいきます:

store: Ext.create('Cloud.store.ServersIP', {
aaa: 'bbb'
}),

しかし、もちろん、私のextraParamsはありません。誰もがこの最後の部分を修正する方法を知っていますか?

10
Daniele Testa

これは私が思いつく最高のコードです。リスナーは必要ありません:)

「users」ストアの新しいインスタンスを作成し、そのインスタンスのパラメーターを変更します。

xtype: 'combobox',
fieldLabel: 'Users',
name: 'users',

store: (function() {
  var s = Ext.create('MyApp.store.Users');
  s.proxy.extraParams = {
    active: '1'
  }
  return s;
})(),
1
Daniele Testa

私はこの問題を解決しました。追加のパラメーターを指定したcombobox queryMode:remote。

"VIEW"内にストアをインスタンス化するinitComponent内でプロキシをオーバーライドするだけです

//instantiate the store

var store = Ext.create('Cloud.store.ServersIP', {
    storeId: 'YourStoreId'
});
store.proxy.extraParams = { param1: 'value1', param2: 'value2' };

xtype:combobox

//set combobox store

{
    xtype: 'combobox',
    queryMode:'remote',
    store : Ext.data.StoreManager.lookup('YourStoreId'),
    ...
    ...
}

私の提案するソリューションを理解していただければ幸いです。

8

グリッドと同じストアを参照する代わりに、同じストアの新しいインスタンスを作成できます。このようにして、2つのストアインスタンスは別々に管理されます。

したがって、フォームで_store: 'Users'_をstore: new MyApp.store.Users()に置き換えてから、より適切に機能するメソッド(extraparams、load with params、beforeload listenerなど)を使用できます。

2
dbrin

「beforeload」ストアイベントをキャッチして、現在のロード操作を変更できます。この方法では、パラメーターは他の要求に永続化されません。

Ext.create('Ext.data.Store', {
    model: MyModel,
    autoLoad: true,
    listeners:{
        // Fires before a request is made. op is an Ext.data.Operation object
        beforeload:function(store,op){ 
            // Set request parameters (without overriding other parameters)
            op.params = Ext.apply(op.params||{},{
                someParam:true
            });
        }
    }
});
2
TheZver

ストアで autoLoad をfalseに設定してから、自分で load メソッドを呼び出し、 params オプション:

var store = Ext.create('My.Store', {
    autoLoad: false
    ...
});

store.load({
    params: {status: 2}
});

これは、コンボを1回だけロードしてからローカルモードでクエリを実行する必要がある場合に機能します。サーバーに複数の呼び出しを行うためにコンボが必要な場合(リモートモード)、ストアの beforeload イベントにパラメーターを設定します。

comboStore.on('beforeload', function(store, operation) {
    operation.params = operation.params || {};
    operation.params.status = 2;
});
1
rixo