Ember.js 解析路由中的关键路径(或链接关系)
我正在处理一堆记录,并为第三方库生成哈希数组。就我个人而言,我不明白为什么这不起作用Ember.js 解析路由中的关键路径(或链接关系),ember.js,ember.js-3,Ember.js,Ember.js 3,我正在处理一堆记录,并为第三方库生成哈希数组。就我个人而言,我不明白为什么这不起作用 export default Route.extend({ model: function(params) { let qp = {viewName: 'byDay'}; return this.store.query('job-receipt', qp).then( (receipts)=> all( receipts.map( (receipt
export default Route.extend({
model: function(params) {
let qp = {viewName: 'byDay'};
return this.store.query('job-receipt', qp).then(
(receipts)=>
all(
receipts.map(
(receipt)=>
hash({
stockCode: receipt.get('job')
.then(job => job.get('stockCode'))
.then(stockCode => stockCode.get('stockCode')),
productClass: receipt.get('job')
.then(job => job.get('stockCode'))
.then(stockCode => stockCode.get('productClass'))
.then(productClass => productClass.get('descr')),
qtyRecvd: receipt.get('qtyRecvd')
})
)
)
);
如果我继续沿着这条路走下去,承诺最终会解决的。如果我检查,productClass promise会直接被调用为空值。为什么不等待stockCode.get('productClass')的解析呢?我知道这里面有真正的价值,因为它最终会解决
我错过了一些超基本的东西。我试过Ember.get(东西、钥匙路径)等。这些不是都是回报承诺吗?RSVP.hash不应该在继续之前等待所有承诺的解决吗?正如我所说,我知道数据是好的,因为它最终会解决问题(而我只是不处理拒绝)
编辑:
我将productClass承诺更改为:
productClass: receipt.get('job')
.then(job => job.get('stockCode'))
.then(stockCode => stockCode.get('productClass'))
.then(productClass => {if (!productClass) {return 'foo';} return productClass.get('descr');})
现在,报告每次都正确地呈现,尽管毫无意义。如果我导航到另一条路线,然后返回到这条路线,它会完美地渲染。所以,这让我很难相信我有某种数据错误。甚至有些股票代码在第一次运行时返回正确的产品类,而不是“foo”。我甚至不知道如何进一步调试它
编辑
我刚看到这个。毕竟这可能是一个错误
我认为主要问题是“receipts.job”很可能是一种DS.belongsTo关系,对吗?如果将其切换为load
job:DS.belongsTo('job',{async:false})
,将强制ember数据同步加载该属性(并将节省大量麻烦)。但这需要数据在json响应中可用
如果这不起作用,你应该调查。使用它来清理代码,使其看起来更简单。在我误解了您的用例的地方,您必须填补一些空白或更改一些内容,但这可能是一个很好的起点
其思想是继续将所有异步调用分解为单独的任务。每个余烬并发任务
对象都会返回一个承诺,因此您可以将它们捆绑在一起,直到到达模型
,您可以像任何其他承诺一样返回该模型
//model.js
import {task} from 'ember-concurrency';
.....
model() {
return this.get('loadData').perform();
},
loadData: task(function*(){
let reciepts = yield this.store.query('job-receipt', qp);
let promises = reciepts.map(r => {
return this.get('loadNestedData').perform(r);
})
return all(promises)
}),
loadNestedData: task(function*(reciept) {
let job = yield receipt.get('job');
return hash({
stockCode: job.get('sockcode')
});
})
原来是一只虫子。beans-to.js的错误导致模型在解析承诺之前不会等待internalModel完成加载。下面链接的修复程序解决了此问题
什么是retval?但是看起来不错。你绝对肯定你的回答是正确的吗?你是对的。这是我试图清理它以供发布的一个人工制品。retval应该是收据。我当然认为他们是对的!我会编辑我的帖子,再放一些信息是的,这份工作是一种归属关系。stockCode和productClass也是如此。也就是说,我写的代码应该可以工作,对吧?我真的不想去解决我开始认为是bug的问题,如果它真的是bug的话。我宁愿把它作为bug提交。我真的不明白为什么这个承诺是“解析”并将一个空值传递给下一个“然后”,而这个值实际上不是空的。我不认为这实际上是ember代码中的一个bug。我怀疑您的代码中存在某种错误,无法正确处理承诺。我怀疑其中的一个结果导致了DS.PromiseObject,并导致了一些问题(这就是为什么最简单的修复方法是使关系{async:false}不,这肯定是我在回答中提到的错误5562。当我在该问题中使用补丁时,它工作得很好。事实上,当我降级到2.16时,它工作得很好。