Разбивка на страницы данных Ember DS.JSONAPIAdapter

Я работаю над проектом, используя EmberJS 2.1 и EmberData 2.1.

Все хорошо, но, кажется, я не могу понять, как я могу разбить результаты на страницы из API.

Текущий ответ, который я получаю от API:

{
  "data": [
    {
      "type": "user",
      "attributes": {
        "firstName": "John",
        "lastName": "Doe",
        "company": "Google",
        "id": "1",
        "title": "Mr.",
        "email": "[email protected]"
      },
      "id": "1"
    },
    {
      "type": "user",
      "attributes": {
        "firstName": "John",
        "lastName": "Doe",
        "company": "Google",
        "id": "2",
        "title": "Mr.",
        "email": "[email protected]"
      },
      "id": "2"
    },
    {
      "type": "user",
      "attributes": {
        "firstName": "John",
        "lastName": "Doe",
        "company": "Google",
        "id": "3",
        "title": "Mr.",
        "email": "[email protected]"
      },
      "id": "3"
    },
    {
      "type": "user",
      "attributes": {
        "firstName": "John",
        "lastName": "Doe",
        "company": "Google",
        "id": "4",
        "title": "Mr.",
        "email": "[email protected]"
      },
      "id": "4"
    }
  ]
}

и мой маршрут выглядит так:

import Ember from 'ember';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';

export default Ember.Route.extend(AuthenticatedRouteMixin, {
    model: function(){
        return this.store.findAll('user');
    }
});

Есть ли какой-нибудь ресурс, где я могу узнать, как реализовать нумерацию страниц? Я нашел много руководств, но они для DS.RESTAdapter.

API был создан с помощью Spring MVC.

Спасибо


person Community    schedule 05.11.2015    source источник
comment
Я не использовал его, но недавно прочитал этот фрагмент в руководствах руководствах. emberjs.com/v2.1.0/models/handling-metadata   -  person cswright    schedule 05.11.2015
comment
похоже, что вы вытащили мета-ключ в своем ответе jsonapi.org/format/#document-meta   -  person cswright    schedule 05.11.2015
comment
Поддерживает ли API разбиение на страницы? Предоставляет ли он какие-либо метаданные, например, сколько пользователей?   -  person NicholasJohn16    schedule 06.11.2015


Ответы (2)


Один из способов реализации нумерации страниц — убедиться, что ваш API возвращает метаданные, относящиеся к запросу. Вам нужно количество результатов, возвращаемых в ответе, и общее количество доступных ресурсов. Он также должен иметь возможность отвечать на параметры запроса для страницы [смещение] и страницы [лимит], чтобы знать, какие результаты отправлять вам обратно.

Сторона Ember — вам понадобится параметр запроса для pageLimit и pageOffset, смещение должно быть рассчитано вами в зависимости от того, сколько записей находится в вашем магазине, и отправлено на сервер как часть запроса, чтобы он знал, с чего начать. возвращая вам данные. Ограничение — это просто количество результатов, которые вы хотите вернуть каждый раз.

person LukeC    schedule 06.11.2015

Мы используем одни и те же библиотеки, и есть 2 альтернативы, которые могут сразу пригодиться:

  • воспользоваться уже реализованными решениями, например ember-addons, поддерживающими разбиение на страницы, быстрая ссылка: https://www.emberaddons.com/?query=pagination
  • реализовать его самостоятельно, если вам нужно слишком индивидуальное решение. В этом случае я бы рекомендовал создать объект запроса так, как вам нужно, и передать его в store.query("user", query), который, поддерживая «из коробки», парсит метаданные, которые можно было бы использовать, например: чтобы различить, есть ли что-то еще быть загружен. Я написал небольшой грубый фрагмент, пожалуйста, извините за опечатки:

    // users controller
    modelName: "user",
    
    pageSize: 10,
    

    // pageLimit: 50, pageOffset: 0, ...

    queryObject: Ember.computed("pageSize",/* more props ,*/ function(){
     const queryObject = {};
     const pageSize = this.get("pageSize");
    
    //... validate pageSize and currentPage values, are they numbers, positive numbers, whatever.....
    
     queryObject.page = {
      page: pageSize
     };
    
     return queryObject;
    }),
    
    ....
    
    actions{
     fetchPage(pageIndex){
      // check pageIndex....
    
      // retrieve actual queryObject
      const queryObject = this.get("queryObject");
    
      // set which batch we are going to load now, "cursor" is just an example, depends what your backend expects
      queryObject.page.cursor = pageIndex;
    
      // query records
      return this.store.query(this.get("modelName"), queryObject)
       .then(/*...do sth with fetched records, update model, retrieve metadata...*/)
       .catch(/*...take care of error...*/);
     }
    }
    
person Pavol    schedule 08.03.2016