直接访问嵌套Ember Route中的URL时未显示数据

时间:2016-10-19 17:47:12

标签: javascript ember.js ember-data

我有一个嵌套的路由设置,因为我希望我的模板也可以嵌套。路线设置如下:

...

      this.route('posts', function() {
        this.route('post', {path: ':post_id'}, function() {
          this.route('comments',  {path: 'comments'}, function() {
            this.route('comment',  {path: ':comment_id'});
          });
        });
      });

...

我的网址可能看起来像这样: /posts/:post_id/comments/:comment_id

如果我通过{{link-to}}导航,那么我没有问题,但是,如果我通过浏览器直接访问特定的网址,那么当出现问题时我就会这样做。想象一下,我的评论页面列出了与我正在查看的帖子(post_id)相关的评论。问题是直接进行,例如输入/posts/123/comments/56并不加载评论列表,只加载评论本身。以下是我的路线设置方式:

// routes/posts.js
...
model() {
    return this.get('store').findAll('post');
}
...

// routes/posts/post.js
...
model(params) {
    return this.get('store').findRecord('post', params.post_id);
}
...

// routes/posts/post/comments.js
...
model(params) {
    let post=this.modelFor('posts/post');
    return post.get('comments');

}
...

// routes/posts/post/comments/comment.js
...
model(params) {


    return this.store.findRecord('comment', params.comment_id);

}
...

如果我输入/posts/123/comments/56,则comments.js模板中不会显示任何列表。

如果我输入/posts/123/comments,则只会在comments.js中显示第一条评论。

虽然我觉得它与modelFor有关,但我不确定我做错了什么。当我直接在该帖子网址中发表评论而不是通过链接到那里导航时,如何正确填充/补充帖子的评论列表?

更新1: 以下是模型:

// post.js
export default DS.Model.extend({
    title: DS.attr("string"),
    articles: DS.hasMany('comment', {async: true})
});
// comment.js
export default DS.Model.extend({
    title: DS.attr("string")
});

我把它连接到海市蜃楼。

以下是评论夹具的示例:

[
    {
        id: 1,
        title: "Apple"
    },
...

和帖子夹具:

[
    {
        id: 1,
        title: "A post with fruits for comments",
        commentIds: [1, 2]
    },
...

更新2:

我已添加templates/posts/post/comments.js

的模板代码
Comments.js!
{{outlet}}
<ol>
    {{#each model as |comment|}}
        <li>{{#link-to "posts.post.comments.comment" comment}} {{comment.title}}{{/link-to}}</li>
    {{/each}}
</ol>

我还更新了上面的comment.js路线,降低了它的复杂程度。

1 个答案:

答案 0 :(得分:0)

根据您的路由器定义 - URL / post / 123 / comments / 56不存在。您的路由器使用以下结构定义URL / posts / 56 / comment / 123(注意单个注释而不是注释) - 您的路由名称是注释,但是您告诉ember它应该解析的路径是注释 - 单数。因此,尝试访问/ post / 123 / comment / 56而不是评论。 此外,没有理由从嵌套注释路由调用this.modelFor('posts / post') - 你应该需要的是modeFor('post')。 最后一点,在评论路线中你应该只需要寻找一个评论,无需解析父模型 - 你已经有了一个唯一的comment_id - store.findRecord('comment',comment_id)应该可以工作。