我下面有以下代码,它将创建一个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);
  }
});



第一个问题是,如果items[0].id = 0,则未在FilteringSelect上设置此项。
fsel.store.fetch({ ... })查询服务器,可以。问题在于,检索到的项目没有保留在内存中,或者保留在内存中,但是在下一个事件中,FilteringSelect并未检索到它们。
我的意思是,当我第一次单击FilteringSelect的下拉菜单时,另一个查询将发送到服务器以获取项目,以下是它们从内存中获取的时间。


谁能帮我解决这两个问题?

注意:我正在使用Dojo版本1.7.2(27913)。

最佳答案

与dojo的某人交谈后,我通过以下方式解决了我的问题:


切换到最新版本(1.8.1),修复了此第一个问题。
在FilteringSelect上使用memoryStore而不是缓存存储(myStore),只会利用内存中的对象。在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);
  }
);

10-05 20:55