【问题标题】:Include nested models but accessing to Proxy objects包括嵌套模型但访问代理对象
【发布时间】:2019-03-28 17:23:28
【问题描述】:

我正在使用 Ember 3.1 和 JSON:API 格式从后端获取数据。

我的模型如下所示:

// Continent model
export default DS.Model.extend({
  name: attr('string'),
  countries: hasMany('countries'),
});

// Country model
export default DS.Model.extend({
  name: attr('string'),
  president: belongsTo('president'),
  regions: hasMany('region')
});

// President model
export default DS.Model.extend({
  name: attr('string')
});

// Region model
export default DS.Model.extend({
  name: attr('string')
});

获取我的模型的方式是:

fetchInformation: task(function* () {
    yield get(this, 'store')
      .findRecord('continent', continent,
        {
          include: 'countries,'
          + 'countries.president,'
          + 'countries.regions'
        }
      ).then((continent) => {
        get(continent, 'countries.firstObject') // This one gets resolved properly
        get(continent, 'countries.firstObject.president') // Get Proxy object
        get(continent, 'countries.firstObject.regions.firstObject') // Get Proxy object
      })

我认为通过使用“包含”和服务器回复为 JSON:API 规范,我可以访问所有这些属性。

在我看来,这些嵌套关系似乎需要以某种方式解决。

我错过了什么?有什么方法可以轻松使用嵌套模型?

【问题讨论】:

  • 关系是 Ember Data 中默认的承诺。为了更清楚地理解它们是 PromiseProxyObjects:承诺将方法和属性代理到解析的对象。您可以在 Ember 指南中找到有关该行为的更多信息:guides.emberjs.com/release/models/relationships/… 您可以通过设置 { async: false } 来禁用它,但您应该知道自己在做什么,因为这会禁用相关数据的延迟获取。

标签: ember.js ember-data json-api


【解决方案1】:

好的,将 {async: false} 添加到 hasMany 和 belongsTo 似乎可以解决问题。

// Continent model
export default DS.Model.extend({
  name: attr('string'),
  countries: hasMany('countries', {async: false}),
});

// Country model
export default DS.Model.extend({
  name: attr('string'),
  president: belongsTo('president', {async: false}),
  regions: hasMany('region', {async: false})
});

// President model
export default DS.Model.extend({
  name: attr('string')
});

// Region model
export default DS.Model.extend({
  name: attr('string')
});

【讨论】:

  • 使用同步关系是一个艰难的决定。你应该清楚你在做什么,并在你的团队中很好地传达这个决定。请确保您已阅读有关 { async: false } 的文档并理解其含义。
  • countriespresident 信息默认会被异步加载。 Ember 数据负责单独获取这些模型,并且它将是非阻塞的。这就是 this.store.findRecord()...then() 中可能无法立即实现代理对象的原因。你想对这些属性做什么? .then 发生了什么?
猜你喜欢
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多