Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 解析路由中的关键路径(或链接关系)_Ember.js_Ember.js 3 - Fatal编程技术网

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时,它工作得很好。