为嵌套的rest url定义ember数据模型

时间:2015-02-10 14:19:57

标签: javascript rest ember.js ember-data

我正在尝试做一些听起来很简单的事情,但我无法找到解决方案。

我的应用程序需要编辑包含页面的文档。

这是我的模特:

MyApplication.Document = DS.Model.extend({
    title: DS.attr('string'),
    pages: DS.hasMany('page', {async: true})
});
MyApplication.Page = DS.Model.extend({
    document: DS.belongsTo('document', {async: true}),
    title: DS.attr('string'),
    params: DS.attr(),
    objects: DS.attr()
});

路线:

MyApplication.Router.map(function () {
    this.resource('document', {path: '/document/:document_id'});
});
MyApplication.Document = Ember.Route.extend({
    model: function (params) {
        return this.store.find('document', params.document_id);
    }
});

当我加载文档1时,应用程序调用{​​{1}}。

问题在于,当我想找到文档的页面时,它会调用

  • http://www.myserver.com/api/document/1

而不是

  • http://www.myserver.com/api/pages/ID

这些嵌套URL在我的应用程序中很重要。

我在主题上发现了不同的内容,例如在JSON响应中添加http://www.myserver.com/api/document/1/pages/ID

links

但是当我呼叫页面时,它会在没有id的情况下请求{ "document": { "id": "1", "title": "Titre du document", "pages": ["1", "2", "3"], "links": {"pages" : "pages"} },

当我要求页面时,我也尝试指定文档:

http://www.myserver.com/api/document/1/pages

无法找到有关此主题的完整文档,因此,如果有人能够解释我的错误,我会感到高兴。

感谢。

3 个答案:

答案 0 :(得分:3)

取决于: EMBER DATA> = V1.0.0-BETA.9

处理嵌套路线的方法隐藏在release notes

  1. 需要像这样回复带回复的链接

    {
        "document": {
        "id": 1,
        "title": "Titre du document",
        "links": {"pages" : "/documents/1/pages"}
    }
    
  2. 您需要自定义adapter:page buldUrl方法

    MyApplication.PageAdapter = DS.RestAdapter.extend({
      // NOTE: this is just a simple example, but you might actually need more customization when necessary
      buildURL: function(type, id, snapshot) {
        return '/documents/' + snapshot.record.get('document.id') + '/pages/' + id;
      }
    });
    

答案 1 :(得分:2)

@code-jaff answer适应Ember 2.1.0:

// app/adapters/page.js
import DS from './application'; // I suppose you have your adapter/application.js

export default DS.RESTAdapter.extend({
  buildURL: function(type, id, snapshot) {
    return this.host + '/' + this.namespace + '/documents/' + snapshot.record.get('document.id') + '/pages/' + id;
  }
});

答案 2 :(得分:0)

您的问题很可能源于JSON中ID的引号。如果您修改序列化程序,以便文档ID和页面ID周围的ID都没有引号,那么您应该获得所期望的行为。此外,您需要修改链接的格式以指向相对路径:

生成的JSON应如下所示:

{
    "document": {
        "id": 1,
        "title": "Titre du document",
        "pages": [1, 2, 3],
        "links": {"pages" : "/documents/1/pages"}
}

请参阅this answer,了解为什么遵守Ember对JSON格式的期望很重要以及对预期格式的概述。