【问题标题】:Proper way to use parent route parameters with ember-data?将父路由参数与 ember-data 一起使用的正确方法?
【发布时间】:2012-08-01 20:37:57
【问题描述】:

在我的应用程序中,我试图使路由结构尽可能接近 API 结构,这在基本情况下有助于 ember,但我仍然对以下情况感到困惑:

(参考http://emberjs.com/guides/outlets/#toc_nesting的例子)

检索/posts/:post_id/comments 数据的最佳方法是什么(假设它不是由/posts/:post_id 提供给我的)?

我是否应该通过comments.deserialize(...) 方法以某种方式将帖子ID 传递给App.Comment.find(...)?有没有比router.getPath('postController.content._id') 更好的获取帖子 ID 的方法?我正在使用修改后的 DS.RESTAdapter。

【问题讨论】:

  • 当您路由到 /posts/:post_id/cmets 时,必须首先调用父级 (/posts/:post_id) 的 connectOutlets。这可能会有所帮助
  • 关于新路由器的答案请看这里:stackoverflow.com/a/15225128/1474739

标签: ember.js ember-data ember-old-router


【解决方案1】:

父路由参数不再作为子路由中的参数访问,但应该用于检索和填充中间数据结构。

鉴于您的模型定义如下:

App.Post = DS.Model.extend({
  text: DS.attr('string'),
  // ...
  comments: DS.hasMany('App.Comment')
});

App.Comment = DS.Model.extend({
  // You may also have: "post: DS.belongsTo('App.Post')", but we do not care for this exemple
  text: DS.attr('string'),
  // ...
});

这应该是可行的:

posts: Ember.Route.extend({
  route: 'posts',

  member: Ember.Route.extend({
    route: '/:post_id', // [A]

    connectOutlets: function (router, post) {
      var applicationController = router.get('applicationController');
      applicationController.connectOutlet('post', post); // [B]
    },

    show: Ember.Route.extend({
      route: '/'
    }),

    comments: Ember.Route.extend({
      route: 'comments',

      connectOutlets: function (router) {
        var postController = router.get('postController'),
            comments = postController.get('comments'); // [C]
        postController.connectOutlet('comments', comments);
      },
    }),
  })
})
  • [A]:根据约定,后模型实例将由路由器自动检索:post_id 指的是具有给定idPost 模型实例(参见this comment)。
  • [B]:这里,PostController 将由路由器使用传递的上下文填充:post,即上面检索到的 Post 实例(参见 [A])。
  • [C]:PostController是post模型实例上的ObjectController(即Proxy),所以它直接持有cmets。

【讨论】:

  • 我从路由位的角度理解这一点(阅读这篇文章后,感觉好多了),但我仍然需要来自 API 端点 /posts/[post_id]/cmets 的 cmets 数据。在这个 API 的情况下,它不附带 /posts/[post_id] 响应——只有一个 URL,但没有数据。 DS.hasMany(没有嵌入标志)究竟是做什么的?感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2013-08-12
  • 2013-02-09
  • 2014-08-30
  • 2011-10-05
相关资源
最近更新 更多