Ember技术问题:如何获取Route的Model返回数据的指定项
如何在Ember中获取指定的Rentals对象?
嘿,我来帮你理清这个问题——你之前的写法没成功,核心原因是**this.get('store').findAll('rentals')返回的不是普通数组,而是一个Promise**,它最终才会解析成Ember Data的DS.RecordArray(一个类数组的响应式对象)。所以你直接同步调用[0]、firstObject这些操作时,Promise还没完成,自然拿不到正确结果。
下面分场景给你解决方案:
1. 获取第一个或最后一个Rentals对象
方法一:用async/await(推荐,代码更简洁)
Ember的model钩子支持异步函数,用await等待Promise完成后再操作:
import Route from '@ember/routing/route'; export default Route.extend({ async model() { // 等待findAll完成,拿到完整的RecordArray const rentals = await this.get('store').findAll('rentals'); // 获取第一个对象 return rentals.get('firstObject'); // 如果要获取最后一个,换成下面这句 // return rentals.get('lastObject'); } });
方法二:用Promise的then链式调用
如果你的项目还不支持async/await,可以用then来处理异步结果:
import Route from '@ember/routing/route'; export default Route.extend({ model() { return this.get('store').findAll('rentals').then(rentals => { // 在回调里操作已解析的RecordArray return rentals.get('firstObject'); // 获取最后一个则用:return rentals.get('lastObject'); }); } });
2. 获取多个指定项(比如前2个、特定索引的项)
先拿到解析后的RecordArray,然后用toArray()把它转换成普通JavaScript数组,之后就能用标准数组方法(slice、索引访问等)操作了:
import Route from '@ember/routing/route'; export default Route.extend({ async model() { const rentals = await this.get('store').findAll('rentals'); // 转换成普通数组 const rentalsArray = rentals.toArray(); // 获取前2个对象 return rentalsArray.slice(0, 2); // 或者获取指定索引的多个项,比如第1个和第3个 // return [rentalsArray[0], rentalsArray[2]]; } });
为什么你之前的写法失败?
再帮你复盘下:
return this.get('store').findAll('rentals')[0]:此时findAll返回的是Promise,不是数组,所以[0]拿到的是undefined。return this.get('store').findAll('rentals').get(0):Promise对象没有get方法,直接报错。return this.get('store').findAll('rentals').firstObject:Promise上不存在firstObject这个属性,自然拿不到值。
只有等Promise完成,拿到真正的DS.RecordArray后,才能调用这些属性或方法哦~
内容的提问来源于stack exchange,提问作者AmazingDayToday
相关产品推荐
相关产品推荐

