Ember.JS - "TypeError: internalModel.getRecord не является функцией" при попытке сторнировать коллекцию записей

- Использование Ember Data 2.7.1--

Я пытаюсь изменить порядок коллекции записей без предварительного преобразования их в массив с помощью toArray(). Эта коллекция объектов происходит от обещания, возвращаемого this.store.findAll('history-item').

Я хочу сделать это угрюмым способом вместо того, чтобы сделать их простым JavaScript. Я получаю TypeError: internalModel.getRecord из записи-array.js. По какой-то причине, когда он пытается выполнить objectAtContent(), содержимое, которое он ищет, кажется, не имеет типа. Через трассировку стека я вижу, что объект, с которым я имею дело, это [Class], класс - это модель элемента истории. Несколько вызовов стека перед objectAtContent(), с которым сталкивается объект, переключается с этой модели элемента истории на какой-либо другой объект Class, не имеющий атрибута type.

Я могу использовать Ember Inspector для правильного просмотра моих данных, и если я просто отобразил исходную коллекцию записей в своем шаблоне, она будет отображаться правильно.

Кто-нибудь сталкивался с этим?

Некоторые мысли и соображения:

Есть ли что-то особенное в том, как findAll() работает со своим обещанием, которое не допускает реверсирования, так как оно перезагружается в фоновом режиме? Я хочу, чтобы он продолжал перезагружать живые данные.

-Я использую ember-cli-mirage, чтобы высмеивать мои базы данных и конечные точки, и я следую инструкциям к письму, которое я думаю. Я использую ненастроенный JSONAPISerializer для mirage и ненастроенный JSONAPIAdapter для ember. Может ли это иметь какое-либо отношение к метаданным, отправляемым со спины? Может быть, это связано с тем, что модели или записи не устанавливаются? Есть ли что-то особенное, что я должен сделать?

Сегмент маршрута, который определяет модель и пытается ее изменить: [примечание: я знаю, что подготовка данных (упорядочение) в маршруте может быть не обычной, но я просто привел это здесь для простоты описания. Я обычно делаю это снаружи в контроллере или компоненте]

  model(){
    return this.get('store').findAll('history-item').then(function(items){
      return items.reverseObjects();
    }).catch(failure);

Объявление модели списка истории:

  export default DS.Model.extend({
    question: DS.attr('string'),
    answer: DS.attr('string')
  });

Конечные точки Ember-Cli-Mirage config.js:

  this.get('/history-items', (schema) => {
     return schema.historyItems.all();
  });

Светильник Ember-Cli-Mirage для предметов истории:

  export default [
    {id: 1, question: "1is this working?", answer: "Of course!"}
  }

Ошибка:

  TypeError: internalModel.getRecord coming from record-array.js

Эта проблема также возникает, когда я пытаюсь создать запись сохранения. Сохранение прошло успешно, но когда модель перезагружается (и пытается вернуться), происходит сбой с той же ошибкой. Неважно, приспособлен я или нет.

контроллер:

  var newHistoryItem = this.store.createRecord('history-item', {
    question: question,
    answer: answer
  });
  newHistoryItem.save().then(success).catch(failure);

2 ответа

Решение

Я думаю, используя toArray Это нормально, не нужно изобретать велосипед. Даже перечисляемые / массивные методы Ember реализованы с использованием toArray под капотом.

Мне нравится хранить преобразования на контроллерах / компонентах, поэтому маршруты касаются только логики [URL -> данные]. Я думаю, что здесь я бы оставил хук модели, возвращающий данные сервера, и использовал вычисляемое свойство на контроллере:

import Ember from 'ember';

export default Ember.Controller.extend({

  reversedItems: Ember.computed('model.[]', function() {
    return this.get('model').toArray().reverse();
  })
});

Twiddle: https://ember-twiddle.com/6527ef6d5f617449b8780148e7afe595?openFiles=controllers.application.js%2C

Вы также можете использовать reverse помощник от Ember Composable Helpers и сделайте это в шаблоне:

{{#each (reverse model) as |item|}}
  ...
{{/each}}

Результат вернулся из store.findAll а также store.query является AdapterPopulatedRecordArray (живой массив), методы мутации, такие как addObject,addObjects,removeObject,removeObjects, unshiftObject,unshiftObjects,pushObject,pushObjects,reverseObjects,setObjects,shiftObject,clear,popObject,removeAt,removeObject,removeObjects,insertAt не должен использоваться.

Взгляните на соответствующее обсуждение и предложенный PR, чтобы выдавать ошибку и предложения использовать toArray() для копирования массива вместо мутации.

Другие вопросы по тегам