2016-10-19 7 views
0

テンプレートをネストしたいので、ネストされたルート設定があります。ネバーされたEmberルートのURLに直接アクセスするとデータが表示されない

... 

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

... 

潜在的に、私のURLは次のようなものになります:私は{{link-to}}を経由して移動すると、私は特定に直接行けば /posts/:post_id/comments/:comment_id

を、私は、しかし、問題がないルートの設定は次のようになりますブラウザを介したURLは、それが間違っているときです。私のコメントページに、私が見ている投稿(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とは何か関係があるように感じていますが、間違っていることはわかりません。リンク先を経由してナビゲートするのではなく、投稿URLのコメントに直接行くと、投稿のコメントリストを適切に作成/水和するにはどうすればよいですか?

UPDATE 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] 
    }, 
... 

はUPDATE 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ルートを更新し、複雑さを軽減しました。

+0

あなたのモデルがどのように見えるか、それらのモデルを返すJSONを表示できます – kiwiupover

+0

私はいくつかの情報で投稿を更新しました。データはそこにあり、URLなしで動作します。ネストされたルートは、直接アクセスしようとすると分解されます。 – Jason

+1

'これです。modelFor( 'posts/post') 'それはポストモデルを返すのでしょうか、あなたのために働いていますか?私はそれが 'this.modelFor( 'posts.post')'だろうと思った。とにかくあなたが働いているなら私を修正してください。 – kumkanillam

答えて

0

ルータの定義に基づいて、URL/post/123/comments/56は存在しません。あなたのルータは以下の構造/ posts/56/comment/123のURLを定義しています(あなたのコメントはコメントではありません) - あなたのルート名はコメントですが、解決すべきパスはコメント単数です。ですから、コメントの代わりに/ post/123/comment/56にアクセスしてみてください。 また、this.modelFor( 'posts/post')をネストされたコメントルートから呼び出す理由はありません。必要なのはmodeFor( 'post')だけです。 コメントルート内の最後のものは、親モデルを解決する必要はありません。あなたはすでに一意のcomment_id - store.findRecord( 'comment'、comment_id)が動作するはずです。

+0

ここに質問を書くとき、それは私の間違いでした。それはコメントだったはずです。私はそれを修正しました。 – Jason

+0

私はちょうどmodelFor( '投稿')を使ってみましたが、エラーが表示されました: 'ルートを処理中にエラーが発生しました:posts.post.comments.comment '未定義のget'プロパティを読み取れません。あなたの最後の点についても、あなたはそれを複雑にする必要がないことについて正しいです...私はあなたが提案したものにそれを減らしました。それでも、特定のコメントに行くと、そのテンプレート内の他のコメントのリストが表示されることを期待しています。私はそのテンプレートを追加しました。これはリンク先を使用してそこに着くと機能しますが、直接そこに行くのではありません。 – Jason

+0

また、エラーを出さなかったcomments.jsのmodelFor( 'posts')も試しましたが、その投稿のコメントリストは表示されませんでした。 – Jason

関連する問題