2012-08-01 65 views
1

在我的应用程序,我试图保持路由结构接近的API结构成为可能,其烬利于在基本情况下,但我仍然感到困惑的下面的情况:正确的方式使用父路由参数与烬数据?

(在参考示例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。

+0

当您路由到/ posts /:post_id/comments必须首先调用parent(/ posts /:post_id)的connectOutlets。可能是这可以帮助 – zaplitny 2012-08-01 21:20:26

+1

对于新的路由器的答案请参阅这里:http://stackoverflow.com/a/15225128/1474739 – 2013-03-05 15:50:55

回答

4

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

鉴于你的模型定义如下:

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是指Post模型实例与给定的id(见this comment)。
  • [B]:这里,PostController将由路由器通过上下文填充:post,这是Post实例上检索(见[A])。
  • [C]:PostControllerObjectController(即Proxy),因此它直接保留注释。
+0

我理解这根据路由位(并阅读本文后,好一点) ,但我仍然需要来自API端点/帖子/ [post_id] /评论的评论数据。在这个API的情况下,它不会附带/ posts/[post_id]响应 - 只有一个URL而不是数据。 DS.hasMany(没有嵌入标志)究竟干什么?谢谢您的帮助。 – dechov 2012-08-02 15:52:11