【问题标题】:Ember 1.0, Ember Data beta 3: getting related model data with DS.FixturesAdapterEmber 1.0、Ember Data beta 3:使用 DS.FixturesAdapter 获取相关模型数据
【发布时间】:2013-10-15 08:41:26
【问题描述】:

这里是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 数组?

【问题讨论】:

    标签: javascript ember.js ember-data relationship


    【解决方案1】:

    您需要在 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 }))

    就像消息中描述的那样,您需要在 responses 属性中使用 async: true

    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

    【讨论】:

    • “要么确保它们都已加载”怎么样?这可能吗?
    • 如果我真的必须这样做,这是丢弃 Ember Data 并重新开始的绝佳论据。
    猜你喜欢
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多