JSBin:http://jsbin.com/IYiqifO/16/edit?html,js,output
我有三个与DS.FixturesAdapter中的灯具一起设置的相关模型,我试图弄清楚如何从组件中的父模型访问相关模型的属性。我的模板如下所示:
{{#each data}}
<li>
<h3>{{name}}</h3>
{{#each responses}}
{{text}}<br />
{{/each}}
</li>
{{/each}}
我也在组件中有一些代码:
data = @get('data').map (respondent) ->
{
name: respondent.get('name')
responses: respondent.get('responses').map (r) -> r.get('text')
}
但是data [n] .responses总是一个空数组。我需要做什么来a)让我的把手模板填充响应数据;和b)让我的data
对象拥有正确填充的responses
数组?
答案 0 :(得分:2)
您需要在Respondent
fixture中传递响应ID:
App.Respondent.FIXTURES = [
id: 1
name: 'Ada Lovelace'
responses: [1,2]
,
id: 2
name: 'Grace Hopper'
responses: [3,4]
]
在此之后您将收到错误:
断言失败:你查找了“回应”关系 “但是一些相关的记录是 没装。要么确保它们全部加载在一起 父记录,或指定关系是异步的 (
DS.hasMany({ async: true })
)
与消息描述一样,您需要使用async: true
媒体资源中的responses
:
App.Respondent = DS.Model.extend
name: DS.attr('string')
responses: DS.hasMany('response', async: true )
在您的模板中,您将看到数据,但在didInsertElement
调用时,responses
关联未加载。发生这种情况是因为模板是绑定感知但是didInsertElement不是。因此,当responses
加载模板更新但未调用didInsertElement时。由于responses
关联返回一个promise,您可以获取数组中的所有响应,并使用Ember.RSVP.all
知道何时加载了所有响应:
App.ShowRespondentsComponent = Ember.Component.extend
didInsertElement: ->
allResponses = []
@get('data').forEach (respondent) =>
allResponses.push respondent.get('responses')
Ember.RSVP.all(allResponses).then =>
@respondentLoaded()
respondentLoaded: ->
thisIsWhatIWant = @get('data').map (respondent) ->
{
name: respondent.get('name')
responses: respondent.get('responses').map (r) -> r.get('text')
}
console.log thisIsWhatIWant
的jsbin