Потеря тонны атрибутов класса ember-data при назначении ответа на запрос к полю модели - PullRequest
0 голосов
/ 12 января 2019

В моем приложении EmberJS у меня есть две модели, Книга и Страница . Книга имеет много отношений с Пейджем. В моем контроллере для редактирования одной книги я делаю запрос, чтобы получить все страницы, связанные с этой книгой, а затем присваиваю ответ на запрос обратно в поле страницы книги.

Я использую стороннюю библиотеку EmberJS ember-models-table для создания разбитых на страницы таблиц. Я передаю book.pages компоненту разбитой на страницы таблицы, и все работает нормально, за исключением случаев, когда я действительно хочу перемещаться между страницами результатов. Используемая версия ember-models-table предполагает наличие определенных полей на book.pages при разбивке на страницы: meta , query , store , и type.modelName . Я могу явно установить эти поля на book.pages, но у меня есть ощущение, что должен быть лучший способ. Почему EmberJS удаляет поля типа meta и store из ответа на запрос ember-data, когда вы устанавливаете этот ответ на другой объект?

Контроллер

this.get('store').query('page', { bookId }).then((res) => {
    set(book, 'pages', res);

    // Third Party Paginated Table Component Requires These Fields
    set(book, 'pages.meta', res.get('meta'));
    set(book, 'pages.query', res.get('query'));
    set(book, 'pages.store', res.get('store'));
    set(book, 'pages.type.modelName', res.get('type.modelName'));
});

HBS - Таблица страниц

{{models-table-paginated
  data=book.pages
  columns=columns
  customClasses=(hash table='table table-condensed')
  showGlobalFilter=false
  showColumnsDropdown=false
  selectRowOnClick=false
  pageSize=10
}}

1 Ответ

0 голосов
/ 15 января 2019

Вам также нужно отредактировать ваш сериализатор. Например, я тоже использую таблицы моделей, но в бэкэнде я использую адаптер Django. Поэтому мне пришлось отредактировать сериализатор для каждой модели, чтобы рассчитать оставшиеся страницы (totalPages) и сформировать это число, чтобы сделать нумерацию страниц на основе вашего размера страницы. Также при запросе на вашем маршруте, вам нужно установить pageSize и страницу по умолчанию. Теперь, если вы не используете мета, как Django, вам следует проверить документацию к вашему адаптеру

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

import DRFSerializer from './drf';
import DS from 'ember-data';
import { isNone } from '@ember/utils';

export default DRFSerializer.extend(DS.EmbeddedRecordsMixin,{
  extractMeta: function(store, type, payload) {
    let meta = this._super(store, type, payload);
    if (!isNone(meta)) {
      // Add totalPages to metadata.
      let totalPages = 1;
      if (!isNone(meta.next)) {
        // Any page that is not the last page.
        totalPages = Math.ceil(meta.count / payload[type.modelName].length);
      } else if (isNone(meta.next) && !isNone(meta.previous)) {
        // The last page when there is more than one page.
        totalPages = meta.previous + 1;
      }
      meta['totalPages'] = totalPages;
    }
    return meta;
  }
...