使用Ember 2加载关系数据

时间:2016-04-04 19:11:32

标签: ember.js ember-2.0.0

使用Ember 2.0加载关系数据时遇到一些问题。鉴于以下两个模型,Project和LineItem,我试图列出属于给定项目的所有行项目:

export default DS.Model.extend({
    name: DS.attr(),
    organisation: DS.attr(),
    customer: DS.attr(),
    hours: DS.attr({defaultValue: 0}),
    line_items: DS.hasMany('line-item', {async: true})  
});

export default DS.Model.extend({
    name: DS.attr(),
    value: DS.attr({defaultValue: 1}),
    quantity: DS.attr({defaultValue: 1}),
    state: DS.attr({defaultValue: 'OPEN'}),
    project: DS.belongsTo('project')
});

在我的路线中,我没有问题地加载一个给定的项目:

export default Ember.Route.extend(AuthenticatedRouteMixin, {
    model(params) {
        return this.store.findRecord('project', params.project_id);
    }
});

在我的组件中,然后我尝试加载我的订单项,如下所示:

从'ember'导入Ember;

export default Ember.Component.extend({
    store: Ember.inject.service(),
    lineItems: function () {
        return this.get('project').get('line_items').toArray();
    }.property('project.line_items'),
});

当我尝试在模板中迭代我的订单项时,没有任何反应:

{{#each lineItems as |item|}}
   <tr>
     <td>
        <a href="#">{{item.name}}</a>
     </td>
   </tr>
{{/each}} 

使用{{#each project.line_items as |item|}}也没有运气。打印this.get('project').get('line_items').toArray()的输出显示空列表。

但是我的项目包含订单项,正如所料:

{  
   "data":{  
      "type":"projects",
      "id":"7d93633d-a264-4cb3-918c-82cc44cb76e2",
      "attributes":{  
         "created":"2016-04-04T19:02:03.113408Z",
         "modified":"2016-04-04T19:02:03.113511Z",
         "name":"Sample name",
         "hours":0
      },
      "relationships":{  
         "line_items":{  
            "meta":{  
               "count":1
            },
            "data":[  
               {  
                  "type":"LineItem",
                  "id":"01915d73-fde5-4b6f-8915-174c16592942"
               }
            ]
         }
      }
   }
}

...我的订单项:

      {
            "type": "line-items",
            "id": "01915d73-fde5-4b6f-8915-174c16592942",
            "attributes": {
                "created": "2016-04-04T19:02:15.622483Z",
                "modified": "2016-04-04T19:02:15.622534Z",
                "name": "Test Line Item",
                "value": 1,
                "quantity": 1
            },
            "relationships": {
                "project": {
                    "data": {
                        "type": "projects",
                        "id": "7d93633d-a264-4cb3-918c-82cc44cb76e2"
                    }
                }
            }
        }

2 个答案:

答案 0 :(得分:1)

我测试了你的代码,是的,它不起作用。它只有在我将模型“item”和“items”重命名时才有效。在我看来,Ember Data不喜欢连接的模型名称......

因此,作为结论,我们应该在任何地方使用简单的名称,或者必须弄清楚确切的语法... camelCase,dash-erized或under_scored?

答案 1 :(得分:0)

我建议做以下事情: 像现在一样在项目中加载项目。 将项目实例传递给组件而不是注入商店实例。

// template which gets rendered after model() hook
...
{{#if model}}
  {{!-- pass the model into your component as 'project' --}}
  {{your-component project=model}}
{{/if}}
...

在组件模板中,您可以检查是否已加载异步加载的关系,然后显示相应的部分:

// template which gets rendered by your component as the project instance is present 
{{#if project.line_items}} {{!-- #if project.lineItems --}}
  {{!-- iterate over line items and print their names --}}
  <ul>
  {{#each project.line_items as |item|}}
   <li>Line item name: {{item.name}}</li>
  {{/each}}
  </ul>
{{/if}}
...

如果一切顺利,这应该有效。您的组件不需要注入存储,也不需要在project.line_items上使用任何计算属性。