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() для копирования массива вместо мутации.