我很难理解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的东西?“
谢谢!
答案 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允许您在模板中愉快地访问点语法关系,这有点令人困惑,但在代码中,您需要将其视为承诺。