web-dev-qa-db-ja.com

新しいパラメーターExtJs Ext.data.JsonStoreでjsonストアをリロードする

現在、新しいパラメーターでjsonストアをリロードするのに問題があります。これが私の店です:

_ newsletters = new Ext.data.JsonStore({
        url: '/newsletters/',
        root: 'results',
        fields: [
             'id',
             'body'
             'recipients'
        ],
        baseParams: { command: 'json', to: dateTo, from: dateFrom },
    autoLoad: true
    });
_

dateToとdateFromは最初は空の文字列( '')であり、firebug/newslettersのチェックインは正しいパラメーターで呼び出されます。

次のテクニックはどれも機能しません。

DateToとdateFromの値を変更してから、newsletters.reload()を呼び出すと、空の文字列である、または空の文字列であるパラメータを使用してページが呼び出されます。

newsletters.reload( { to: 'test1', from: 'test2' } );を呼び出しても、パラメーターは空の文字列として認識されます。

最後に、マニュアルから私が試しました:

_lastOptions = newsletters.lastOptions;
Ext.apply(lastOptions.params, {
    to: 'test1',
    from: 'test2'
});
newsletters.reload(lastOptions);
_

これも、更新されたパラメーターを使用して/ newslettersを要求しません。

どんなアドバイスでも大歓迎です!

27
babadbee

実際にparamsオブジェクトをload()メソッドに渡すことができます

newsletters.load({
  params: {to: 'test1', from: 'test2'}
})
29
Mchl

ドキュメントから、あなたはおそらく行うことができます:

store.setBaseParam('to', dateTo);

さて、私が正しく理解していれば、dateToとdateFromが変更されるたびにbaseParamsが変更されるようにしてください。

あなたは試すことができます:

var dateTo = '', dateFrom = '';

store.on('beforeload', function(s) {
    s.setBaseParam('to', dateTo);
    s.setBaseParam('from', dateFrom);
});

// This should work :
dateTo = 1;
dateFrom = 2;
store.load();
5
Drasill

私の問題は、プロキシ経由でバックエンドにデータを要求するストアがあることでした。このリクエストは、filterという名前のパラメーターを保持する必要があります。これは、クライアントが関心を持っている結果のセットを決定するためのバックエンドに役立ちます。このパラメーターは、Comboboxまたはその他のパラメーターからロードされますユーザーが使用するフィルターを表現するために使用できるコンポーネント。

私の観点からは、パラメーターをStoreに設定したり、loadパラメーターを使用したりしないでください。理由を説明します。

  1. ストアにパラメーターを構成すると、同じストアを使用する他のすべてのコンポーネントにこのパラメーターが構成されます。つまり、同時実行の問題が発生する可能性があります。
  2. 2番目のケースでは、loadメソッドで構成可能にすることは興味深いことではありません。自分でloadメソッドを明示的に使用するたびに、したくないので、すでにいくつかのコンポーネントがあることに注意してください。このメソッドをトリガーするページングコンポーネントやカスタムコンポーネントなど。

私の観点から正しい方法は何ですか?

loadがトリガーされるたびに、邪魔にならない方法で追加のパラメーターをアタッチします。つまり、トリガーに変更を加える必要はなく(ここでトリガーはstore.load()を実行する任意のコンポーネントである可能性があります)、ストアはこの新しいパラメーターを認識しません。

これは、プロキシにデータを要求する前に行われる操作であることがわかります。私の場合は、beforeloadイベントのリスナーとして実装しました。 beforeloadが実行されると、新しいパラメーターをリスナーの操作パラメーターに集約するだけで、 documentationbeforeload( store, operation, eOpts )になります。最終的な実装は次のようなものです。

store.on({
    beforeload: function (store, operation, opts) {
        Ext.apply(operation, {
            params: {
                filterName: Ext.getCmp('filterCombo').getValue()
            }
       });
    }
});
4