我有一个从路线自动渲染的模板。车把模板指定子视图。
子视图在我的js中有一个扩展的View,它指定了一个要使用的控制器。它还有一个引发事件的点击处理程序。控制器处理事件。
到目前为止这是有效的 - 问题是控制器试图调用...
this.transitionToRoute("about")
由于某些原因无效。
我还在主视图上处理一个click事件,并在它的控制器中使用完全相同的方法,并且可以正常工作。 那有什么区别?我还能做些什么来处理过渡?
示例: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);
}
});
答案 0 :(得分:4)
不同之处在于indexController具有对应用程序路由器的引用,但是创建的你的childViewController没有对所述路由器的引用。你应该让Ember为你创建控制器,你可以这样做。
在ChildView中删除childController创建和控制器规范。
将以下内容添加到IndexController
needs: ['childView'] // Can be a string if you only need one other controller
这将使Ember为您创建控制器,并将其添加到indexController的控制器集合中。然后,您可以在索引模板中指定controllerBinding
,如下所示。
{{view App.ChildView controllerBinding="controllers.childView"}}
可在此处Managing dependencies between controllers和此处darthdeus vs Ember.js: Controller's Needs Explained
找到更详细的说明