У меня есть следующий код ниже, который создаст 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, на сервер отправляется другой запрос для получения элементов, в следующий раз они получают их из памяти.

Может ли кто-нибудь помочь мне решить эти две проблемы?

Примечание: я использую Dojo версии 1.7.2 (27913).

1
Ivo Silva 26 Окт 2012 в 17:51
val = items[0].id[0]; должен это сделать. Значения магазина представлены в виде массивов.
 – 
undefined
31 Окт 2012 в 12:34
Не могли бы вы рассказать нам, какую версию додзё вы используете?
 – 
undefined
31 Окт 2012 в 12:34
id - это свойство объекта, и я получаю первый товар в магазине, поэтому items[0]. Забыл указать версию, использую Dojo 1.7.2 (27913) .
 – 
Ivo Silva
31 Окт 2012 в 12:46
Я имел в виду, что свойства объекта магазина - это массивы. Или хотя бы в 1.6.
 – 
undefined
31 Окт 2012 в 12:48
К сожалению, здесь этого не происходит. Должно быть что-то связанное с виджетом FilteringSelect.
 – 
Ivo Silva
31 Окт 2012 в 13:23

1 ответ

Лучший ответ

После разговора с кем-то из додзё я решил свой вопрос следующим образом:

  1. При переходе на последнюю версию ( 1.8.1 ) эта первая проблема была устранена.

  2. Использование memoryStore в FilteringSelect вместо хранилища кеша ( 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);
  }
);
4
Ivo Silva 4 Ноя 2012 в 03:40