List View
Всем привет!
В прошлой статье мы рассмотрели компонент Query, используемый для написания GraphQL-запросов. И там же описывалось, что сформированный запрос отправляется на API-сервер через компонент Connector, после чего полученный результат выводится на странице через ListView, о котором и пойдет более детальный разговор в этой статье.
На самом деле это тоже очень важный и довольно мощный компонент и использовать его можно не только непосредственно внутри компонента Connector, но и внутри других компонентов для вывода имеющихся в них массивов объектов. Если вы внимательно изучите вот этот пример, то увидите, что компонент ListView используется для вывода комментариев пользователя внутри объекта пользователя.
Давайте внимательней рассмотрим этот пример. В нем выполняется запрос:
query user {
object: user (
where: {
username: "Fi1osof"
}
){
id
username
fullname
image
Resources (
first: 3
orderBy: createdAt_DESC
where: {
type: Comment
}
){
...resource
CommentTarget{
...resource
}
}
}
}
fragment resource on Resource{
id
name
content
uri
}
В нем мы получаем конкретного пользователя по юзернейму. Помимо некоторых полей объекта User мы еще и запрашиваем 3 комментария (подзапрос Resources с типом Comment), а в каждом этом комментарии мы еще и запрашиваем CommentTarget, то есть топик, к которому оставлен комментарий.
В ответ на запрос мы получаем следующие данные с сервера:
{
"data": {
"object": {
"id": "cjoe87z9f001b0d9683ysg0m4",
"username": "Fi1osof",
"fullname": "",
"image": "9da9e7e309fd4e77cf42c02a7a42142e.jpeg",
"Resources": [
{
"id": "cjvs9myrqbx150a8967zkkda4",
"name": "Дима, в статью дописал ссылку на видео.",
"uri": "/comments/topics/query.html/dima,-v-statyu-dopisal-ssylku-na-video..html",
"content": "...",
"__typename": "Resource",
"CommentTarget": {
"id": "cjvs5l3vqbtvo0a895brraes7",
"name": "Query",
"uri": "/topics/query.html",
"content": "...",
"__typename": "Resource"
}
},
{
"id": "cjvs8xobxbwn10a89tmi0wxk7",
"name": "Кстати, на случай, если ты вдруг не понял как реда",
"uri": "/comments/topics/query.html/kstati,-na-sluchay,-esli-ty-vdrug-ne-ponyal-kak-reda.html",
"content": "...",
"__typename": "Resource",
"CommentTarget": {
"id": "cjvs5l3vqbtvo0a895brraes7",
"name": "Query",
"uri": "/topics/query.html",
"content": "...",
"__typename": "Resource"
}
},
{
"id": "cjvs8t9z8bwin0a89kyf4v6tt",
"name": "Все, вижу, ты сделал поддомен. Вот на него и надо",
"uri": "/comments/topics/query.html/vse,-vizhu,-ty-sdelal-poddomen.-vot-na-nego-i-nado.html",
"content": "...",
"__typename": "Resource",
"CommentTarget": {
"id": "cjvs5l3vqbtvo0a895brraes7",
"name": "Query",
"uri": "/topics/query.html",
"content": "...",
"__typename": "Resource"
}
}
],
"__typename": "User"
}
}
}
В шаблоне для вывода объекта пользователя мы используем компонент ObjectView. В нем для вывода комментариев (массива объектов Resources) мы использовали компонент ObjectField, указав ему name=Resources. И вот здесь самое интересное: получив из объекта пользователя массив комментариев Resources, ObjectField, определив, что это массив, передает его в специальный контекст для передачи массива объектов вглубь. Теперь на любом уровне вложенности ниже можно вывести эти объекты в цикле с помощь компонента ListView.
Таким образом ListView можно использовать для вывода в цикле различных Array-свойств объектов. К примеру, посмотрите внимательно еще и вот этот шаблон. В нем я из полученных объектов шаблонов вывожу имена их прямых потомков.
Так же аналогичным способом для вывода вложенных одиночных объектов можно использовать ObjectView.
Второй вариант использования компонента ListView (и он же по сути основной) - это вызов его внутри компонента Connector для вывода полученных данных в цикле. Этот вариант подробно рассматривался в прошлой статье.