Запрос дочерних элементов

Приведенный пример данных с описаниями сортов кофе является достаточно примитивным, так как представляет собой плоский список элементов. Пример 9.6 несколько усложняет его, добавляя несколько дополнительных элементов с дочерними записями, чтобы воспроизвести вложенную структуру. Механизм ItemFileReadStore явно использует атрибут children для хранения списка дочерних элементов, а мы будем использовать разновидность формата JSON со ссылками, чтобы обеспечить группировку сортов кофе по степени обжарки. Обратите внимание, что для иллюстрации возможности использования ссылок кофе Light French был преднамеренно отнесен и к категории Medium Roasts, и к категории Dark Roasts. Так как каждый элемент должен иметь уникальный идентификатор, было бы невозможно включить один и тот же элемент в разные родительские элементы другим способом.

Пример 9.6. Обновленный пример набора данных с описаниями сортов кофе, имеющий иерархическую структуру
{
identifier : "name",
items : [
{
name : "Light Roasts",
description : "A number of delicious light roasts",
children : [
{_reference: "Light Cinnamon"},
{_reference: "Cinnamon"},
{_reference: "New England"}
]
},

{
name : "Medium Roasts",
description : "A number of delicious medium roasts",
children : [
{_reference: "American or Light"},
{_reference: "City, or Medium"},
{_reference: "Full City"},
{_reference: "Light French"}
]
},
{
name : "Dark Roasts",
description : "A number of delicious dark roasts",
children : [
{_reference: "Light French"},
{_reference: "French"},
{_reference: "Dark French"},
{_reference: "Spanish"}
]
},
{name : "Light Cinnamon", description : "Very light brown, dry ,
tastes like toasted grain with distinct sour tones, baked, bready"},
...
]
}

Достаточно часто встречаются ситуации, когда необходимо запросить дочерние элементы.


В данном случае это означает необходимость отыскать названия кофе, относящегося к той или иной категории по степени обжарки. Решение этой задачи иллюстрируется в примере 9.7
для элемента Dark Roasts.
Пример 9.7. Извлечение элемента и обход его дочерних элементов
coffeeStore.fetch({
query: {name : "Dark Roasts"},
onItem : function(item, request) {
dojo.forEach(coffeeStore.getValues(item, "children"),
function(childItem) {
console.log(coffeeStore.getValue(childItem, "name"));
});
}
});

В этом примере выполняется простой запрос на получение родительского элемента Dark Roasts, и, как только мы получаем его, с помощью функции getValues извлекается атрибут children со множеством значений, после чего с помощью функции dojo.forEach производится обход всех дочерних элементов – не забываем при этом использовать функцию getValue, чтобы получить доступ к значению атрибута элемента.

Обратите внимание, что конструкция {_reference: someIdentifier} является лишь особенностью реализации. Вам никогда не потребуется строить запросы на основе атрибута _reference, потому что в действительности нет такой вещи, как атрибут _reference, – это всего лишь стандартизованный способ вести учет.


Насколько это касается прикладного программиста, все, что находится в хранилище dojo.data, следует рассматривать как старый добрый элемент.

Как вы уже имели возможность убедиться, механизм ItemFileReadStore обладает весьма широкими и гибкими возможностями, что делает его вполне подходящим способом хранения данных для самых разных ситуаций, особенно при разработке прототипов приложений и когда необходимо быстро получить результат. Благодаря простой спецификации совсем несложно будет написать на стороне сервера процедуру, отправляющую данные, которые вебклиент, использующий dojo.data, сможет обработать. Однако не забывайте при этом, что вы всегда сможете дополнить существующий механизм своими расширениями или создать собственную реализацию..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
ItemFileReadStore
ItemFileWriteStore
Анализ ItemFileReadStore
Иерархии и ссылки в формате JSON
Извлечение элемента по идентификатору

Вернуться в раздел: Dojo / Абстракция данных