emberjs-RC2-如何从控制器访问路由器实例&动作不会冒泡到路由器

时间:2013-04-13 19:37:38

标签: ember.js ember-router

在路由器中我有一个'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中的控制器访问路由器实例。

jsfiddle

路由器:

 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>

1 个答案:

答案 0 :(得分:1)

谢谢你们的最爱,结束小提琴,它有很多帮助:)。我想我弄清楚这里发生了什么。

首先,控制器中的destroyMe功能不对,它应该是

destroyMe: function(comment) {
  this.get('target').send('removeComment', comment);
}

然后,您在post.com的模板中调用它,但是您在PostEmentsRou​​te的子路由'PostEditCommentRoute'中实现它。因此,在PostCommentsRou​​te中提取事件应该可以使它工作。

现在,作为关于代码的整体评论,有一些奇怪的事情,例如

<p>{{#linkTo 'post.comments'}}  comments{{/linkTo}}</p>  

{{render 'post.comments' comments}}

因此,当您点击“评论”链接时,它会抛出一个错误(视图已经呈现)。

路由中还有一些可以避免的代码,例如所有setupController挂钩如

setupController: function(controller, model){
  controller.set('content', model);
}

这是默认行为,因此您不必覆盖它。