1

以下に、 FilteringSelectを作成し、最初に選択した項目を設定する次のコードを示します。

// Store initialization:
var jsonStore = custom.store.JsonRest({ ... });
var memoryStore = dojo.store.Memory();
var myStore = dojo.store.Cache( jsonStore, memoryStore);
var dataStore = custom.store.MyObjStore({ objectStore: myStore, ...  });

// FilteringSelect initialization:
var fsel = new dijit.form.FilteringSelect({
             id: 'fsel',
             searchAttr: 'id',
             store: dataStore
           });

// Setting the first item on FilteringSelect, retrieved from store objects
fsel.store.fetch({ query: {id:""},
  onComplete: function (items, request) {
    var val = "";
    if (items.length>0) val = items[0].id;
    fsel.set('value', val);
  }
});
  1. 最初の問題はitems[0].id = 0、この項目が FilteringSelect に設定されていない場合です。

  2. fsel.store.fetch({ ... })サーバーにクエリを実行します。これで問題ありません。問題は、取得されたアイテムがメモリに保持されていないか、保持されていても、次のイベントで FilteringSelect によって取得されないことです。つまり、FilteringSelect のドロップダウンを初めてクリックすると、アイテムを取得するために別のクエリがサーバーに送信され、次の時間はメモリから取得されます。

これら2つの問題を解決するのを手伝ってくれる人はいますか?

注: Dojo バージョン 1.7.2 (27913) を使用しています。

4

1 に答える 1

4

道場の誰かと話した後、私は次のように質問を解決しました。

  1. 最後のバージョン ( 1.8.1 ) に切り替えると、この最初の問題が修正されました。

  2. キャッシュ ストア ( myStore ) の代わりに FilteringSelect でmemoryStoreを使用すると、メモリ内のオブジェクトを利用するだけです。myStore (キャッシュ ストア)に対してクエリを実行すると、オブジェクトがサーバーからメモリに読み込まれます。

// Store initialization:
var jsonStore = new JsonRest({ ... });
var memoryStore = new Memory();
var myStore = new Cache(jsonStore, memoryStore);
// Note: ObjectStore was removed.

// FilteringSelect initialization:
var fsel = new FilteringSelect({
         id: 'fsel',
         searchAttr: 'id',
         store: memoryStore
       });

// Setting the first item on FilteringSelect and loading items to memory
when (myStore.query({id:""}),
  function (items, request) {
    var val = "";
    if (items.length>0) val = items[0].id;
    fsel.set('value', val);
  }
);
于 2012-11-03T23:40:07.393 に答える