将相关模型传递给EmberJS中的操作

时间:2016-11-04 16:30:34

标签: ember.js ember-data

我很难理解EmberJS处理将关联模型作为动作参数传递的方式背后的逻辑。

在模板中,我有以下内容:

{{#each account.people as |person|}}
  <p>{{person.name}}</p>

  {{#each person.relationships as |relationship|}}
    <p {{action "doStuff" person relationship relationship.otherPerson}}>
      {{relationship.otherPerson.name}}
    </p>
  {{/each}}
{{/each}}

奇怪的是doStuff行动

  • person是模型
  • relationship是模型
  • otherPerson是承诺

我不知道这是否是预期的行为以及如何以正确的方式处理它。

注意:这是一个人为的例子,传递所有这些论点很奇怪,这只是为了说明我的观点。

注意2:我知道我可以在我的操作中使用Promise.resolve(otherPerson),但我不明白为什么我应该使用这样的低级别调用。

注3:我的问题是“因为我正在访问otherPerson.name,为什么otherPerson仍然是我在行动中时要解决的承诺?有没有办法永远拥有一个已经解决的模型而不做hacky的东西?“

谢谢!

1 个答案:

答案 0 :(得分:0)

我不确定这里的实际问题是什么,但是......

relationship.otherPerson

是一个承诺,因为Ember Data延迟加载关系。 HTMLBars模板能够理解并等待关系的解决方案,但他们仍然承诺在幕后。

如果您在模型定义中使用{async: false} e.g。

export default Model.extend({
  name: attr('string')
  author: belongsTo('person', {async:false})
});

这告诉Ember Data数据已经加载,并且它可以将关系视为同步。访问relationship.otherPerson时不会返回任何承诺。它确实要求您已经加载了关系数据,无论是在您的路线中是侧载还是确信它已经存储在商店中。

Ember允许您在模板中愉快地访问点语法关系,这有点令人困惑,但在代码中,您需要将其视为承诺。