javascript - 使用 Ember.js 加载属于父模型的数据

标签 javascript ember.js ember-data

考虑与概述的示例类似的内容 here :

App.Router.map(function() {
  this.resource("posts", function() {
    this.resource("post", { path: "/posts/:post_id" }, function() {
      this.resource("comments", { path: "/comments" });
    });
  });
});

使用 DS.RESTAdapter。当我通过调用 API URL /posts 访问 PostsRou​​te 时,Router 将加载所有帖子。

然后当我访问 PostRoute 时,例如对于带有 id=1 的帖子,它不会再次访问 API,即它不会访问 /post/1。它从商店加载帖子。

然后我想访问 CommentsRou​​te 以使用 id=1 发表文章。如何加载评论?

当我加载帖子列表时,我是否应该首先侧载所有评论?不过在这种情况下,我需要加载所有帖子的所有评论。是否可以仅在需要时加载评论,即当我访问 CommentsRou​​te 时?

在这种情况下,我实际上如何从后端加载评论? 具体来说,当我访问实际显示评论的页面时,如何编写 CommentsRou​​te 以从 RESTful API 加载评论?

我想一个人需要具备以下条件:

App.Post = DS.Model.extend({
  comments: DS.hasMany('comment')
});

App.Comment = DS.Model.extend({
  post: DS.belongsTo('post')
});

App.CommentsRoute = Ember.Route.extend({
  model: function() {
    /*
     * How do I inject params.post_id here
     * to make a request to the RESTful API?
     * Which URL would be called?
     * /comments?post_id=ID
     * /post/post_id/comments
     * ...
     */

    // Doesn't work, hits /comments
    return this.store.find('comment', { post_id: params.post_id });
  }
});

为什么

return this.store.find('comment', { post_id: params.post_id });

点击 /comments?

最佳答案

您只需要像这样声明您的CommentsRou​​te:

App.CommentsRoute = Ember.Route.extend({
  model: function() {
    return this.modelFor('post').get('comments');
  }
});

它所做的是获取 PostRoute 的模型并获取其评论。

Ember-data 处理其背后的逻辑。如果注释被旁加载,它只会返回这些。否则它将发出 GET 请求来获取它们。

为此,您需要在序列化帖子中包含 links 属性。 links 属性需要包含您希望 ember-data 用于获取评论的 URL。

例如您的连载文章可能如下所示:

{
  "post": {
    "id": 1,
    "title": "Rails is omakase",
    "links": { "comments": "/posts/1/comments" }
  }
}

参见 DS.RESTAdapter#findHasMany .

hasMany 关系可能需要声明为异步才能正常工作:

App.Post = DS.Model.extend({
  comments: DS.hasMany('comment', { async: true })
});

关于javascript - 使用 Ember.js 加载属于父模型的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23958323/

相关文章:

javascript - 使用 Ember 存储和模型作为 JqGrid 的源数据

ember.js - 如何在 Ember.js 中删除模型的 hasMany 关联中的所有记录

Javascript 猜数字游戏 - 设置计数器和 while 循环

javascript - 如何让我的搜索栏完成搜索

javascript - 我如何使用 WebGL 创建基于 float 的 RGBA 纹理?

javascript - 如何隐藏选项中的文本 ionic2

ember.js - Ember.js 中多个模型的对象集合作为模板中的可迭代内容

javascript - Ember Web 应用程序 - 显示 JSON 数据时出现问题 - 开放天气 map API

javascript - 使用 Ember 的 bindAttr 时的 SafeStrings?

javascript - Ember.js 为特定模型 ID 添加 css 类