Chr*_*Lam 5 promise ember.js ember-data ember-cli ember-cli-mirage
--使用 Ember 数据 2.7.1--
我试图颠倒记录集合的顺序,而无需先使用 toArray() 将它们转换为数组。这个对象集合来自 this.store.findAll('history-item') 返回的 promise。
我想以 ember 的方式做到这一点,而不是让它们成为普通的 javascript。我收到来自 record-array.js 的 TypeError: internalModel.getRecord。出于某种原因,当它尝试执行 objectAtContent() 时,它正在查看的内容似乎没有类型。通过堆栈跟踪,我可以看到我正在处理的对象是 [Class],类是历史项目模型。在 objectAtContent() 之前的一些堆栈调用,正在处理的对象从那个历史项目模型切换到其他没有类型属性的 Class 对象。
我能够使用 Ember Inspector 正确查看我的数据,如果我只是在我的模板上显示原始记录集合,它会正确显示。
有没有人遇到过这个?
一些想法和考虑:
- findAll() 如何使用它的承诺,因为它在后台重新加载而不允许逆转,这有什么特别之处吗?我确实希望它继续重新加载实时数据。
-我正在使用 ember-cli-mirage 来模拟我的数据库和端点,并且我已经按照我认为的信件中的说明进行操作。我将未配置的 JSONAPISerializer 用于海市蜃楼,并使用未配置的 JSONAPIAdapter 用于 ember。它与从后面发送的元数据有什么关系吗?它可能与未设置的模型或记录有关吗?我有什么特别的事情要做吗?
定义模型并尝试反转它的路由段:[注意:我知道在路由中准备数据(排序)可能不是惯例,但为了便于描述,我只是把它放在这里。我通常在控制器或组件的外部进行]
model(){
return this.get('store').findAll('history-item').then(function(items){
return items.reverseObjects();
}).catch(failure);
Run Code Online (Sandbox Code Playgroud)
历史列表模型声明:
export default DS.Model.extend({
question: DS.attr('string'),
answer: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)
Ember-Cli-Mirage config.js 端点:
this.get('/history-items', (schema) => {
return schema.historyItems.all();
});
Run Code Online (Sandbox Code Playgroud)
历史项目的 Ember-Cli-Mirage 固定装置:
export default [
{id: 1, question: "1is this working?", answer: "Of course!"}
}
Run Code Online (Sandbox Code Playgroud)
错误:
TypeError: internalModel.getRecord coming from record-array.js
Run Code Online (Sandbox Code Playgroud)
当我尝试创建保存记录时也会发生此问题。保存成功,但是当模型重新加载(并尝试反转)时,它会失败并出现相同的错误。我是不是固定装置都没有关系。
控制器:
var newHistoryItem = this.store.createRecord('history-item', {
question: question,
answer: answer
});
newHistoryItem.save().then(success).catch(failure);
Run Code Online (Sandbox Code Playgroud)
我觉得用着toArray就好,没必要重新发明轮子。toArray甚至 Ember 的可枚举/数组方法也是在底层实现的。
我喜欢在控制器/组件上保留转换,因此路由只关心 [URL -> data] 逻辑。我想在这里我会保留返回服务器数据的模型挂钩,并在控制器上使用计算属性:
import Ember from 'ember';
export default Ember.Controller.extend({
reversedItems: Ember.computed('model.[]', function() {
return this.get('model').toArray().reverse();
})
});
Run Code Online (Sandbox Code Playgroud)
旋转:https://ember-twiddle.com/6527ef6d5f617449b8780148e7afe595 ?openFiles=controllers.application.js%2C
您还可以使用Ember Composable Helpersreverse中的帮助程序并在模板中执行此操作:
{{#each (reverse model) as |item|}}
...
{{/each}}
Run Code Online (Sandbox Code Playgroud)