Ember 1.0,Ember Data beta 3:使用DS.FixturesAdapter获取相关的模型数据

时间:2013-10-15 08:41:27

标签: javascript ember.js ember-data relationship

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数组?

1 个答案:

答案 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

这是一个有效的http://jsbin.com/IYiqifO/19/edit

的jsbin