ember.js,如何在从不支持旁加载的服务器加载主模型时加载相关模型

ember.js, How do I load related models while loading main model from server that is not support sideloading

我是 ember.js 新手,每天都会遇到问题:-)

今天的问题是我的服务器后端不支持 sideloading。 (如果我理解 'sideload' 正确,它是服务器 returns 相关模型同时具有多个 JSON 根)

例如,我的服务器每个请求仅 returns 以下:

对于/api/v1/posts.json

{
  posts: [{
    id: 91,
    title: "ember.js"
  }, {
    id: 81,
    title: "ember-data.js"
  }]
}

对于/api/v1/comments.json

{
  comments: [{
    id: 928,
    postId: 91,
  }, {
    id: 927,
    postId: 92,
  }]
}

当我加载 post 模型时,转到 /#/posts,视图没有呈现 comment 但是如果我通过键入 URL 手动加载 comment comment route地址栏,/#/comments,返回,评论正常显示

所以我就这样尝试,在post route,(第三行)

App.PostsRoute = Ember.Route.extend({
  model: function(params) {
    this.store.find('comment');
    return this.store.find('post');
  }
})

而且有效! (也加载和填充评论!)但我认为这是不正确的方式。

有什么好的或正确的方法可以做到这一点吗?

编辑 -- 添加模型定义

我的 post 模型是这样的:

App.Post = DS.Model.extend({
  title: DS.attr('string'),
  content: DS.attr('string'),
  comments: DS.hasMany('comment', {async: true}),
})

评论模型为:

App.Account = DS.Model.extend({
  content: DS.attr('string'),
  post: DS.belongsTo('post'),
})

我不使用 ember-cli,我从 ember-starter-kit 开始,并在主页和网络上观看了一些教程。

而且,我使用自定义 Adapter 因为我的后端实际上不支持 ember 样式 JSON 响应并且我无法触摸它:

App.SpinAdapter = DS.ActiveModelAdapter.extend({
  host: 'http://spin.example.com:8080',
  namespace: 'api/v1',

  init: function() {
    this._super();
    console.log('SpinAdapter...');
  }
});

App.SpinSerializer = DS.ActiveModelSerializer.extend({
  extract: function(store, type, payload, id, requestType) {
    console.log('SpinSezer#extract...' + type + '/' + id + '/' + requestType);
    return payload;
  },
});

App.PostAdapter = App.SpinAdapter.extend({});
App.PostSerializer = App.SpinSerializer.extend({});

App.CommentAdapter = App.SpinAdapter.extend({});
App.CommentSerializer = App.SpinSerializer.extend({});

在编辑问题后思考更多的时候找到了答案!

问题是覆盖了 extract 方法。 (有关我上一个问题的详细信息,

当我覆盖整个 extract 作为问题的答案时,我发现某些方法没有被调用。 (也许 _super.extract 做了更多其他事情。)所以我只是用每个模型 extract 进行了测试,并调用了 super。并且有效!

更改的 extract 方法是:

App.SpinAdapter = DS.ActiveModelAdapter.extend({
  host: 'http://spin.example.com:8080',
  namespace: 'api/v1',

  init: function() {
    this._super();
    console.log('SpinAdapter...');
  }
});

App.SpinSerializer = DS.ActiveModelSerializer.extend({
  extract: function(store, type, payload, id, requestType) {
    console.log('SpinSezer#extract...' + type + '/' + id + '/' + requestType);
    return this._super(store, type, payload, id, requestType);
  },
});

App.PostAdapter = App.SpinAdapter.extend({});
App.PostSerializer = App.SpinSerializer.extend({
  extract: function(store, type, payload, id, requestType) {
    return this._super(store, type, {posts: payload}, id, requestType);
  },
});

App.CommentAdapter = App.SpinAdapter.extend({});
App.CommentSerializer = App.SpinSerializer.extend({
  extract: function(store, type, payload, id, requestType) {
    return this._super(store, type, {comments: payload}, id, requestType);
  },
});

问题已解决。但遗憾的是,由于 posts 的响应没有关于 comments 的条目,(数据库和 API 结构是 "only child knows their parent")如果我先加载 post,然后相关评论未加载。 一半的解决方案。

我刚刚尝试使用嵌套路由并希望自动加载嵌套 URL,但它没有发生。 :-(