1

我有一个计算属性,如果不存在,我试图在其中创建一个记录,但是jQuery.Deferred exception在尝试呈现计算属性时不断得到一个。

这是我到目前为止所拥有的:

deadlineDay: computed(function() {
  const oneWeekFromNow = moment().startOf('day').add(1, 'week');
  const store = this.get('store');

  return store.queryRecord('deadline-day', {
    filter: {
      date: oneWeekFromNow
    }
  }).then(result => {
    if (!result) {
      result = store.createRecord('deadline-day', {
        date: oneWeekFromNow
      });

      result.save();
    }

    return result;
  });
}),

然后在我的模板中,我尝试使用一个简单的助手进行渲染:

{{display-date deadlineDay.date}}

助手{{display-date}}只是调用return date.format('dddd, MMM Do')

看起来 Ember 正在尝试自己呈现承诺,而不是等待它解决。

这会导致错误,因为.format它不是 promise 的方法。

我想这是一个非常常见的用例,但我在理解上有失误。非常感谢您的帮助!

我不确定它是否相关,但我的后备存储是 sessionStorage via ember-local-storage

4

1 回答 1

2

我同意 Ember 可能会尝试自己呈现承诺,而不是等待承诺解决。不幸的是,我目前无法重现该错误。

在 Ember.js 中,通常建议将数据调用放在路由文件中。这将允许您在加载模板文件之前进行查询/保存和所有其他数据收集。您描述的计算属性显示没有依赖键,因此这可能证明将调用移动到您的场景的路由文件是合理的。

通用 route.js 示例:

import Ember from 'ember';

export default Ember.Route.extend({
  async model() {
    let record;
    record = await this.store.queryRecord('record', { queryParams });

    if (!record) {
        record = this.store.createRecord('record', { properties });
    }

    return record.save();
  },

});

但是,如果使用计算属性中的承诺,Ember Igniter 的作者可能会有一些额外的有用指导,这些指导可能是值得的。 计算属性中的 Promise 指南

于 2017-12-25T05:51:19.510 回答