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

最佳答案

您需要在Respondent固定装置中传递响应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

关于javascript - Ember 1.0,Ember Data beta 3:使用DS.FixturesAdapter获取相关模型数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19376730/

10-12 13:49