Правильный шаблон для возврата данных разбиения на страницы с помощью RESTAdapter данных ember-data?
Я показываю список статей на странице, которые извлекаются с помощью Embed Data RESTAdapter. Мне нужно реализовать bootstrap'esque paginator (см.: http://twitter.github.com/bootstrap/components.html#pagination) и не может найти разумный шаблон для возврата данных разбивки на страницы, таких как число страниц, количество статей, текущей страницы, в рамках одного запроса.
Например, я бы хотел, чтобы API возвращал что-то вроде:
{
articles: [{...}, {...}],
page: 3,
article_count: 4525,
per_page: 20
}
Одна из идей заключалась в том, чтобы добавить App.Paginator DS.Model, чтобы ответ мог выглядеть так:
{
articles: [{...}, {...}],
paginator: {
page: 3,
article_count: 4525,
per_page: 20
}
}
Но это кажется излишним, чтобы взломать что-то настолько тривиальное. Кто-нибудь решил эту проблему или нашел конкретный образец, который им нравится? Есть ли простой способ управления сопоставлениями RESTAdapter для учета таких сценариев, как это?
Ответы
Ответ 1
Попробуйте использовать Ember Pagination Support Mixin и предоставить собственную реализацию следующего метода. Вместо загрузки всего содержимого вы можете получить требуемый контент, когда пользователь перемещает страницы. Все, что вам нужно, это общая учетная запись ваших записей.
didRequestRange: function(rangeStart, rangeStop) {
var content = this.get('fullContent').slice(rangeStart, rangeStop);
this.replace(0, this.get('length'), content);
}
Ответ 2
С помощью ember-data-beta3 вы можете передать meta
-property в свой результат. По умолчанию RESTSerializer ищет это свойство и сохраняет его.
Вы можете получить доступ к метаданным следующим образом:
var meta = this.get("store").metadataFor("post");
Если вы не можете изменить JSON, возвращенный с сервера, вы можете переопределить extractMeta
-hook на ApplicationSerializer (или любой другой сериализатор, специфичный для модели).
App.ApplicationSerializer = DS.RESTSerializer.extend({
extractMeta: function(store, type, payload) {
if (payload && payload.total) {
store.metaForType(type, { total: payload.total }); // sets the metadata for "post"
delete payload.total; // keeps ember data from trying to parse "total" as a record
}
}
});
Подробнее о метаданных здесь