2015-01-05 1 views
0

Есть ли способ настроить JsonRestStore для работы с существующей веб-службой, которая возвращает массив объектов, который является , а не на корневом уровне ответа JSON ?Dojo JsonRestStore с массивом не на корневом уровне ответа JSON

Мой ответ JSON в настоящее время похож на это:

{ 
    message: "", 
    success: true, 
    data: [ 
     { name: "Bugs Bunny", id: 1 }, 
     { name: "Daffy Duck", id: 2 } 
    ], 
    total: 2 
} 

мне нужно сказать JsonRestStore, что он найдет строки под «данными», но я не могу видеть способ сделать это от смотрения на documentation. Схема представляется как возможность, но я не могу понять ее через документы (или то, что я нахожу в Google).

Мои веб-службы возвращают данные в формате, ожидаемом магазинами в Ext JS, но теперь я не могу реорганизовать стоимость веб-сервисов на лету (вопрос о разбиении на страницы через HTTP-заголовки вместо значений строки запроса, вероятно, тоже будет интересным, но это проблема еще на один день).

Спасибо.

ответ

2

Хотя он только вызывается в документах API, существует внутренний метод в dojox/data/JsonRestStore с именем _processResults, который для этой цели является легко переопределяемым. Он получает данные, возвращенные службой и оригиналом «Отложенные» из запроса, и ожидается, что он вернет объект, содержащий items и totalCount.

Основываясь на данных выше, что-то вроде этого должно работать:

var CustomRestStore = declare(JsonRestStore, { 
    _processResults: function (results) { 
     return { 
      items: results.data, 
      totalCount: results.total 
     }; 
    } 
}); 
+0

Это, безусловно, похоже на то, что я хочу, спасибо. К сожалению, моя оценка додзе не прошла, к сожалению, но она все еще стоит на вершине моего списка альтернатив, если я буду решать bin Ext JS. Я могу настроить тестовый пример, используя ваш код, чтобы увидеть его работу и улучшить мою уверенность в додзё. Еще раз спасибо –

+0

У меня есть немного времени на моих руках, поэтому я снова пытаюсь это сделать. Я работаю с справочником dijit.form.FilteringSelect 1.10. Я выполнил ваше собственное решение (которое, похоже, работает), но я получаю «TypeError: не могу прочитать свойство« toString »неопределенных« ошибок в цифре/форме/_AutoCompleterMixin.js в строке 187 (примерно через секунду после ввода чего-либо и появления результатов ниже выпадающего списка). Если я верну свой образец обратно на простой JsonRestStore, я не получу ошибок (и никаких данных, конечно). Любые идеи, основанные на этих скудных деталях? Благодарю. –

+0

Если я установил searchAttr в свой combobox FilteringSelect так же, как и значение labelAttr, тогда это нормально. Однако моя служба ожидает «query =» для searchAttr, а не «anyFieldName =». Я отправлю новый вопрос, я думаю (поскольку это не связано с моим первоначальным запросом). Благодарю. –

0

Идея с dojo/store заключается в том, что имеются справочные магазины, но они предназначены для настройки в соответствии с любым форматом данных, который вы хотите. Например, https://github.com/sitepen/dojo-smore имеет несколько дополнительных магазинов (например, тот, который обрабатывает данные Csv). Эти магазины служат хорошим примером того, как обрабатывать данные, предлагаемые в другой структуре.

Существует также новый проект dstore, http://dstorejs.io/, который в конечном итоге заменит dojo/store в Dojo 2, но работает сегодня против Dojo 1.x. Это может быть проще для создания настраиваемого хранилища в соответствии с вашей структурой данных.

+0

Спасибо, я проверю, что из (я не знал об этом). Тем не менее, я только что понял, что ежегодный пакет поддержки SitePen стоит 12 500 долларов, поэтому мне, возможно, придется отложить идеи перехода на Dojo в обозримом будущем. –

+0

Увы, после просмотра документов dstore я не вижу никакой информации о том, как получать данные из веб-службы, которая не соответствует ожиданиям dojo: https://github.com/SitePen/dstore#dstore –

+0

Для додзе/store, посмотрите, как работает хранилище OData, которое поставляет данные по-разному: https://github.com/dojo/dojox/blob/master/store/OData.js – Dylan