在路由器中我有一个'removeComment'事件。在控制器中如果通过 this.get('target')。send('removeComment',context);来访问它,我收到错误没有处理事件'removeComment'。当我使用 this.get('target.router')。send('removeComment',comment)时,错误变为对象#没有方法'发送'。使用 this.router.send('removeComment',comment),会出现错误:无法读取未定义的属性'send'。
同样只是将'removeComment'动作发送到PostEditController不会通过控制器冒泡,直到路线。
如何从emberjs rc2和routerV2中的控制器访问路由器实例。
路由器:
EmBlog.Router.map(function() {
this.resource("posts", {path: '/posts'}, function(){
this.route('new');
this.resource('post', {path: '/:post_id/'}, function(){
this.route('edit', {path: '/edit'});
this.route('comments', {path: '/comments'});
this.route('newComment');
this.route('comment', {path: '/comments/:comment_id'});
this.route('editComment', {path: '/comments/:comment_id/edit'});
});
});
});
控制器
EmBlog.PostEditCommentController = Ember.ObjectController.extend({
destroyMe: function(comment) {
this.get('target.router').send('removeComment', comment);
}
});
路由器
EmBlog.PostEditCommentRoute = Ember.Route.extend({
events: {
removeComment: function(context) {
var comment = context.get('content');
comment.deleteRecord();
comment.get('store').commit();
this.transitionTo('post.index');
}
}
});
我在帖子/评论模板中访问它。这是该模板的控制器。
EmBlog.PostCommentsController = Ember.ArrayController.extend({
needs: ['postEditComment']
});
帖子/评论模板
<script type="text/x-handlebars" data-template-name="post/comments">
{{#each controller}}
<p><a href='#' {{action destroyMe this target="controller.controllers.postEditComment"}}> Destroy </a></p>
{{/each}}
</script>
答案 0 :(得分:1)
谢谢你们的最爱,结束小提琴,它有很多帮助:)。我想我弄清楚这里发生了什么。
首先,控制器中的destroyMe功能不对,它应该是
destroyMe: function(comment) {
this.get('target').send('removeComment', comment);
}
然后,您在post.com的模板中调用它,但是您在PostEmentsRoute的子路由'PostEditCommentRoute'中实现它。因此,在PostCommentsRoute中提取事件应该可以使它工作。
现在,作为关于代码的整体评论,有一些奇怪的事情,例如
<p>{{#linkTo 'post.comments'}} comments{{/linkTo}}</p>
{{render 'post.comments' comments}}
因此,当您点击“评论”链接时,它会抛出一个错误(视图已经呈现)。
路由中还有一些可以避免的代码,例如所有setupController挂钩如
setupController: function(controller, model){
controller.set('content', model);
}
这是默认行为,因此您不必覆盖它。