Ember.JS - 'TypeError: internalModel.getRecord is not a function' when trying to reverse a collection of records

Ember.JS - 'TypeError: internalModel.getRecord is not a function' when trying to reverse a collection of records

--使用Ember数据2.7.1--

我正在尝试反转记录集合的顺序,而不是首先使用 toArray() 将它们转换为数组。这个对象集合来自 this.store.findAll('history-item') 返回的承诺。

我想用 ember 的方式来做,而不是让它们变得简单 javascript。我收到 TypeError: internalModel.getRecord 来自 record-array.js。出于某种原因,当它尝试执行 objectAtContent() 时,它正在查找的内容似乎没有类型。通过堆栈跟踪,我可以看到我正在处理的对象是 [Class],class 是历史项模型。在 objectAtContent() 之前的几个堆栈调用,正在处理的对象从该历史项模型切换到其他 Class 没有类型属性的对象。

我能够使用 Ember Inspector 正确查看我的数据,如果我只是在我的模板上显示原始记录集合,它会正确显示。

有没有人运行参与其中?

一些想法和注意事项:

-findAll() 的工作方式有什么特别之处吗?因为它在后台重新加载,所以不允许逆转?我确实希望它继续重新加载实时数据。

-我正在使用 ember-cli-mirage 来模拟我的数据库和端点,我已经按照我认为的字母说明进行操作。我正在为 mirage 使用未配置的 JSONAPISerializer,为 ember 使用未配置的 JSONAPIAdapter。它与从后面发送的元数据有什么关系吗?它可能与未设置的模型或记录有关吗?我有什么特别需要做的吗?

定义模型并尝试反转它的路线段: [注意:我知道在路线中准备数据(排序)可能不是惯例,但我只是把它放在这里以便于描述。我通常在控制器或组件外部进行]

  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);

我觉得用toArray就可以了,不用另起炉灶。甚至 Ember 的 enumerable/array 方法也是使用 toArray 实现的。

我喜欢在 controllers/components 上保持转换,所以路由只关心 [URL -> 数据] 逻辑。我想在这里我会保留返回服务器数据的模型挂钩,并在控制器上使用计算的 属性:

import Ember from 'ember';

export default Ember.Controller.extend({

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

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

您还可以使用 Ember Composable Helpers 中的 reverse 助手并在模板中执行此操作:

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

store.findAllstore.query返回的结果是一个AdapterPopulatedRecordArray(实时数组),不应使用像addObject,addObjects,removeObject,removeObjects, unshiftObject,unshiftObjects,pushObject,pushObjects,reverseObjects,setObjects,shiftObject,clear,popObject,removeAt,removeObject,removeObjects,insertAt这样的变异方法。

看看相应的discussionProposed PR 抛出错误并建议使用 toArray() 复制数组而不是变异。