Как разделить отношения между данными и данными
Как вы разбиваете запрос на связанные данные? Например, если у моего Person есть прикрепленные к нему тысячи Задачи, если я сделаю следующее: в RESTful мышлении я бы получил все из них.
var tasks = person.get('tasks');
Это будет слишком много данных. Как заставить параметр запроса на запрос, который работает за кулисами? Идеально для конечной точки с чем-то вроде этого, прикрепленного к концу.
?&offset=3&limit=3
Вот fiddle, чтобы проиллюстрировать, что я пытаюсь выполнить в IndexController
. Я понятия не имею, что "разумный способ" состоит в том, чтобы делать разбитые на страницы запросы с использованием данных ember.
Ответы
Ответ 1
Это не существовало, когда этот вопрос был впервые задан, но теперь есть аддон под названием ember-data-has-many-query, который, по-видимому, способен на это, по крайней мере, для RESTAdapter
и JSONAPIAdapter
. Похоже, что у него есть некоторые причуды из-за данных ember-данных, которые еще не поддерживают разбивку на страницы как первоклассную концепцию. Если это вас беспокоит, всегда есть store.query
, но для этого требуется, чтобы ваш API поддерживал (в вашем примере) параметр фильтра person_id
на конечной точке /tasks
.
по теме:
(похоже, что этот вопрос не связан с JSON API, но обсуждение имеет значение)
Ответ 2
Как и сегодня, по-прежнему нет способа по умолчанию для разбиения на страницы в ember.
Сначала мы должны, вероятно, посмотреть на более простую вещь, разбиение на страницы запроса findAll
.
Это можно сделать с помощью .query({page:3})
, но приводит к некоторым проблемам:
- Это хорошее решение для классической разбивки на страницы, но для бесконечного прокрутки вам все равно нужно вручную объединить результаты.
- Результаты не кэшируются, поэтому перемещение вперед и назад по разбитому списку приводит к множеству запросов. Иногда это необходимо, если список доступен для редактирования, но часто его нет.
Для второй проблемы я создаю небольшой аддон под названием ember-query-cache
, который подключается к хранилищу и позволяет кэшировать результаты запроса. Очень короткая демонстрация доступна здесь.
Теперь, если мы поговорим об отношениях, я бы честно рекомендовал использовать верхний уровень .query
, пока у вас не будет лучшей поддержки непосредственно из данных ember-данных:
store.query('task', { person: get(person, 'id'), page: 3 }
В этом нет ничего плохого. Вы получаете свой результат и имеете отношения в другом направлении. Он работает без каких-либо взломов в ember-data, поскольку вам не нужно кэшировать, и если вам нужно кэшировать, это требует очень небольшого количества хакеров, которые я сделал в своем приложении.
Мы все еще надеемся, что данные ember-данных станут полностью завершенными JSONAPI, и для этого потребуется разбиение на страницы. Я думаю, что с точки зрения API лучше всего будет иметь возможность запрашивать следующую и предыдущую страницу в ManyArray, возвращаемые этими отношениями. Это будет вместе с JSONAPI, где предоставляется следующая и предыдущая ссылка. Но для того, чтобы понять, что теперь вам придется взломать данные в ember-данные, не получая большого улучшения над верхним уровнем .query
, который я успешно использовал во многих проектах.
Ответ 3
В руководствах Ember.js по использованию моделей вы также можете отправить запрос вместе с вызовом find()
.
this.store.find('person', { name: "Peter" }).then(function(people) {
console.log("Found " + people.get('length') + " people named Peter.");
});
Из руководства:
Хэш параметров поиска, который вы переходите на find()
, непрозрачен для Ember Данные. По умолчанию эти параметры будут отправлены на ваш сервер в качестве тело запроса HTTP GET
.
Использование этой функции требует, чтобы ваш сервер знал, как интерпретировать ответы на запрос.