Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 余烬数据JSONAPIAAdapter:获取嵌套资源_Javascript_Django_Ember.js_Django Rest Framework_Ember Data - Fatal编程技术网

Javascript 余烬数据JSONAPIAAdapter:获取嵌套资源

Javascript 余烬数据JSONAPIAAdapter:获取嵌套资源,javascript,django,ember.js,django-rest-framework,ember-data,Javascript,Django,Ember.js,Django Rest Framework,Ember Data,我试图让Ember数据的JSONAPIAdapter与嵌套资源一起工作。对于服务器部分,使用了django rest框架json api 我的(简化)余烬模型: case.js comment.js 服务器对/api/v1/cases/4的响应如下所示: { "data": [ { "type": "cases", "id": "4", "attributes": { "first-name": "Hans",

我试图让Ember数据的JSONAPIAdapter与嵌套资源一起工作。对于服务器部分,使用了django rest框架json api

我的(简化)余烬模型:

case.js

comment.js

服务器对
/api/v1/cases/4
的响应如下所示:

{
  "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"
          }
        }
      }
    }
  ]
}
现在,如果我正确理解了Ember数据和JSON-API规范,那么当我引用注释时,Ember应该请求
/API/v1/cases/4/comments
。相反,它请求
/api/v1/comments/5
,这显然返回了
404

我的问题总结如下:

  • 服务器响应是否符合JSON-API规范
  • 如何让ember尊重嵌套的路由
我使用的是ember v2.8


额外问题:我在创建新评论时面临同样的问题-如何让余烬将
发布到
/case/4/comments
而不是
/comments

JSON API规范没有强制执行任何特定的URL模式,因此您尝试执行的是兼容的。然而,我发现使用平面URL结构更容易处理余烬数据,尽管有一个解决方法

您需要查看插件,并将一些逻辑从它添加到模型的适配器中

使用该插件,您可以使用
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结构中,以便在整个应用程序中发表评论。因此,在决定走这条路之前,一定要权衡一下这一权衡。

JSON API规范没有强制执行任何特定的URL模式,因此您尝试执行的是兼容的。然而,我发现使用平面URL结构更容易处理余烬数据,尽管有一个解决方法

您需要查看插件,并将一些逻辑从它添加到模型的适配器中

使用该插件,您可以使用
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结构中,以便在整个应用程序中发表评论。因此,在决定走这条路线之前,一定要权衡一下这个折衷方案。

是的,这是可行的,应该按如下方式设置

models/client.js

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

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

    client: DS.belongsTo('client')
});
models/client.js

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

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

    client: DS.belongsTo('client')
});
/模板/client/edit.bhs


名称
{{{#每个模型.活动作为|活动}
{{campaign.name}
{{/每个}}

是,此功能正常,应按如下方式设置

models/client.js

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

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

    client: DS.belongsTo('client')
});
models/client.js

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

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

    client: DS.belongsTo('client')
});
/模板/client/edit.bhs


名称
{{{#每个模型.活动作为|活动}
{{campaign.name}
{{/每个}}

是的,这是可行的,而且您的json看起来是正确的。您如何“引用注释”?此外,我的帖子也直接发布到评论资源。目前,我只是在模板中访问
model.comments
。根据ember社区slack对此问题的反馈,有一些微妙之处与如何访问资源有关-您对此了解更多吗?假设您的模型是“案例”的实例,这看起来是正确的。我已经使用firebase和loopback完成了这项工作。不确定“微妙之处”。如果您愿意,我将添加一个带有json示例和代码示例的答案。这肯定很有趣。我还将尝试在一个最小的设置中重现这个问题。是的,这是可行的,并且您的json看起来是正确的。您如何“引用注释”?此外,我的帖子也直接发布到评论资源。目前,我只是在模板中访问
model.comments
。根据ember社区slack对此问题的反馈,有一些微妙之处与如何访问资源有关-您对此了解更多吗?假设您的模型是“案例”的实例,这看起来是正确的。我已经使用firebase和loopback完成了这项工作。不确定“微妙之处”。如果您愿意,我将添加一个带有json示例和代码示例的答案。这肯定很有趣。我还将尝试在最小的设置中重现该问题。由于余烬数据目前不支持对
POST
补丁
请求的
相关链接进行跟踪,如果不选择平展URL,这似乎是一种方法-谢谢!由于余烬数据目前不支持对
POST
PATCH
请求执行
相关的
链接,如果不选择平展URL,这似乎是一种方法-谢谢!我们决定使用
ember数据url模板
方法,因为我们也需要调用
POST
补丁
的嵌套路由(请参见我上面的评论)。不管怎样,谢谢你发布这篇文章,下次当我只需要
GET
时,我会尝试这种方法!我们决定使用
ember数据url模板
方法,因为我们也需要调用
POST
补丁
的嵌套路由(请参见我上面的评论)。不管怎样,谢谢你发布这篇文章,下次当我只需要
GET
时,我会尝试这种方法!