http://jsfiddle.net/bugsinamber/xjvYk/6/
設定
記事のリストを含むインデックス ビューがあります。これは、アプリケーション アウトレットにレンダリングされます。各ストーリーをクリックすると、ストーリー ビューが同じアウトレットにレンダリングされます (インデックス ビューを置き換えます)。ネストされたルートを使用しています。
問題
ストーリービューからインデックスビューに戻るために「すべてのストーリー」をクリックすると、うまくいきます。しかし、ブラウザーの [戻る] ボタンを押してインデックス ビューに戻ると、パスが "/stories" に正しく変更されますが、インデックス ビューはレンダリングされません。インデックス ビューをレンダリングするには、[戻る] ボタンをもう一度押す必要があります。
テンプレート
<script type="text/x-handlebars" data-template-name="application">
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="stories">
<p>Stories Index Page</p>
{{#each story in controller}}
{{#linkTo "story"}}
{{story.title}}
{{/linkTo}}
{{/each}}
</script>
<script type="text/x-handlebars" data-template-name="story">
{{#linkTo "index"}}Back to all stories{{/linkTo}}
{{title}}
<p>Story test page</p>
</script>
app.js
App = Ember.Application.create({});
App.Router.map(function() {
this.resource("stories", function() {
this.resource("story", {path: ':story_id'});
});
});
App.StoriesRoute = Ember.Route.extend({
model: function() {
return App.Story.find();
}
});
App.StoryRoute = Ember.Route.extend({
model: function(params) {
return App.Story.find(params.story_id);
},
renderTemplate: function() {
this.render('story', { // the template to render
into: 'application' // the template to render into
});
}
});
App.IndexRoute = Ember.Route.extend({
redirect: function() {
this.transitionTo('stories');
}
});
私がこれまでに知っていること
ネストされたルートを使用しない場合、これは正しく機能します。ビューをネストしていない場合は、ネストされたルートを使用すべきではないようですが、それは設計のニーズを制限します。論理的には、この場合、ネストされたルートを使用できるようにする必要があります。
以下に示すように、ストーリーコントローラーから「ストーリー」にアクセスする必要があるため、ルートをネストしています。ルートをネストしない場合、最初にストーリー ビューをロードすると (まだインデックス ビューをロードせずに)、「posts」は何も返しません。
App.StoryController = Ember.ObjectController.extend({
needs: "stories",
previousPost: function() {
return this.advancePost(1);
},
nextPost: function() {
return this.advancePost(-1);
},
advancePost: function(delta) {
var index, length, posts;
posts = this.get('controllers.stories');
length = posts.get('length');
index = (posts.indexOf(this.get('content')) + delta + length) % length;
if (index >= 0 && index < length) {
return this.transitionToRoute('story', posts.objectAt(index));
}
}
});
前もって感謝します。