ルートから自動的にレンダリングされるテンプレートがあります。ハンドルバーテンプレートは子ビューを指定します。
子ビューには、使用するコントローラーを指定する拡張ビューがjsにあります。また、イベントを発生させるクリックハンドラーもあります。コントローラがイベントを処理します。
その時点まで、これは機能します-問題は、コントローラーが呼び出しを試みることです...
this.transitionToRoute("about")
そして、何らかの理由でそれは機能しません。
また、メインビューでクリックイベントを処理し、そのコントローラーでまったく同じメソッドを使用しますが、これは機能します。 では、違いは何ですか?代わりに、移行を処理するために何ができますか?
例: http: //jsfiddle.net/b6xsk/4/
この例では、インデックスのクリックは機能しますが、子ビューのクリックは機能しないことがわかります。
以下のコードはフィドルと一致します。
私のテンプレート...
<script type="text/x-handlebars">
{{#linkTo "index"}}Index{{/linkTo}}
{{#linkTo "about"}}About{{/linkTo}}
<div class="app-template">
{{outlet}}
</div>
</script>
<script type="text/x-handlebars" data-template-name="index">
<h1>Index (click me)</h1>
{{view App.ChildView}}
</script>
<script type="text/x-handlebars" data-template-name="about">
<h1>About</h1>
</script>
<script type="text/x-handlebars" data-template-name="childview">
<h2>Child View (click me)</h2>
</script>
そして私のJS...
App = Ember.Application.create();
// two simple routes
App.Router.map(function() {
this.route("index");
this.route("about");
});
// index controller handles event and moves to about route
App.IndexController = Ember.Controller.extend({
useraction: function(event) {
console.log("User Action");
this.transitionToRoute("about"); // works !
}
});
// index view handles the click and raises event (handled by controller)
App.IndexView = Ember.View.extend({
click: function(event) {
this.get('controller').send('useraction', event);
}
});
// handles child event and tries (but fails) to transition to about route
App.ChildViewController = Ember.Controller.extend({
childuseraction: function(event) {
console.log("Child User Action");
// do some validation or other code and maybe then transition
// in this example always transition
this.transitionToRoute("about"); // doesn't work ! why??
event.stopPropagation(); // don't allow the event to bubble
}
});
// instantiated so we can attach to view below
App.childViewController = App.ChildViewController.create();
// child view is added in the index handlebar template and raises
// event on click that is handled by child view controller
App.ChildView = Ember.View.extend({
templateName: 'childview',
controller: App.childViewController,
click: function(event) {
this.get('controller').send('childuseraction', event);
}
});