Ember数据JSONAPIAdapter:获取嵌套资源

时间:2016-10-26 12:47:12

标签: javascript django ember.js django-rest-framework ember-data

我正在尝试使用Ember Data的JSONAPIAdapter来处理嵌套资源。对于服务器部分,使用了django-rest-framework-json-api。

我的(简化)余烬模型:

case.js

DropDownList

comment.js

export default Model.extend({
  firstName: attr('string'),
  lastName: attr('string'),
  comments: hasMany('comment'),
})

服务器对export default Model.extend({ text: attr('string'), case: belongsTo('case'), }) 的回复如下:

/api/v1/cases/4

现在,如果我正确理解Ember Data和JSON-API规范,当我引用注释时,ember应该请求{ "data": [ { "type": "cases", "id": "4", "attributes": { "first-name": "Hans", "last-name": "Peter", }, "relationships": { "comments": { "meta": { "count": 1 }, "data": [ { "type": "comments", "id": "5" } ], "links": { "related": "http://localhost:8000/api/v1/cases/4/comments" } } } } ] } 。相反,它会请求/api/v1/cases/4/comments,这显然会返回/api/v1/comments/5

总结我的问题:

  • 服务器响应是否符合JSON-API规范?
  • 如何让ember尊重嵌套路线?

我正在使用ember v2.8。

奖金问题:我在创建新评论时面临同样的问题 - 如何将404改为POST而不是/case/4/comments

2 个答案:

答案 0 :(得分:1)

JSON API规范不强制执行任何特定的网址格式,因此您尝试执行的操作符合规定。但是,我发现使用Ember Data可以更轻松地使用平面URL结构,但有一种解决方法。

您希望查看ember-data-url-templates插件,并将其中的一些逻辑添加到您的型号适配器。

使用该插件,您可以使用app/adapters/comment.js

执行此操作
import ApplicationAdapter from './application';
import UrlTemplates from 'ember-data-url-templates';

export default ApplicationAdapter.extend(UrlTemplates, {
  namespace: 'api/v1', // You may or may not need this namespace setting:
                       // I'm a little rusty in this area :)

  urlTemplate: '{+host}/case/{caseId}/comments{/id}',

  urlSegments: {
    contentId: function(type, id, snapshot/*, query */) {
      return snapshot.belongsTo('case', { id: true });
    }
  }
});

除非插件允许解决此问题,否则我会相信这会阻止您进入整个应用中的评论的URL结构。因此,在决定沿着这条路走下去之前,一定要权衡这种权衡。

答案 1 :(得分:1)

是的,这可以设置如下

模型/ client.js

set CONDA_FORCE_32BIT=

模型/ client.js

export default DS.Model.extend({
    name: DS.attr('string'),
    telno: DS.attr('string'),

    campaigns: hasMany()
});

/templates/client/edit.bhs

export default DS.Model.extend({
    name: DS.attr('string'),
    startdate: DS.attr('date'),
    enddate: DS.attr('date'),

    client: DS.belongsTo('client')
});

http://localhost:3000/api/clients/1

    <table class="table table-bordered table-striped table-condensed">
        <thead>
            <tr>
                <th></th>
                <th>Name</th>
            </tr>
        </thead>
        <tbody>
            {{#each model.campaigns as |campaign|}}
                <tr>
                    <td>{{campaign.name}}</td>
                </tr>
            {{/each}}
        </tbody>
    </table>

http://localhost:3000/api/clients/1/campaigns

{
{
  "links": {
    "self": "http://localhost:3000/api/clients/1"
  },
  "data": {
    "type": "clients",
    "relationships": {
      "campaigns": {
        "links": {
          "related": "http://localhost:3000/api/clients/1/campaigns"
        }
      }
    },
    "id": "1",
    "attributes": {
      "name": "Test",
      "telno": "123"
    },
    "links": {
      "self": "http://localhost:3000/api/clients/1"
    }
  }
}