2013-04-13 4 views
0

В маршрутизаторе у меня есть событие «removeComment». В контроллере, если он доступен через this.get ('target'). Send ('removeComment', context);, я получаю сообщение об ошибке Ничего не обработано событие 'removeComment'. Когда я использую this.get ('target.router'). Send ('removeComment', комментарий), ошибка становится Объект # не имеет метода 'send'. используя this.router.send ('removeComment', комментарий), даст ошибку: Невозможно прочитать свойство 'send' of undefined.emberjs-RC2- как получить доступ к экземпляру маршрутизатора от контроллера и действия не доходят до маршрутизатора

Также просто отправка действия «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'); 
    }   
    } 
}); 

Я обращаюсь к нему в шаблоне post/comments. Это контроллер для этого шаблона.

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

Не могли бы вы добавить карту маршрутов, пожалуйста? Я думаю, что this.get ('target').send ('removeComment', контекст) 'обязательно должен работать, но я подозреваю, что это отправлено на другой маршрут. –

+0

Спасибо за ваше время. Я добавил маршрутизатор в верхней части вопроса и решил также добавить ** [jsfiddle] (http://jsfiddle.net/VrR2T/6/) **. – brg

ответ

1

Благодаря Foir updae, конец скрипки, это очень помогает :). Кажется, я понял, что здесь происходит.

Прежде всего, функция destroyMe в контроллере не правильно, это должно быть действительно

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

Затем вы вызываете его в шаблоне из post.comments, но вы ее реализации в «PostEditCommentRoute», который является подпрограммой PostCommentsRoute. Поэтому потянуть мероприятие в PostCommentsRoute должно заставило его работать.

Теперь, как общий комментарий о вашем коде, есть некоторые странные вещи, такие как

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

{{render 'post.comments' comments}} 

В результате, при нажатии на ссылку «Комментарии», он выдает ошибку (мнение уже оказано).

Есть также некоторый код на маршрутах, которые можно было бы избежать, например, все setupController крючки как

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

, который по умолчанию, так что вам не придется переопределить его.

+0

Спасибо sly7_7 за отзывы. Я удалил setupController, где они придерживаются значения по умолчанию. для кода представления кода комментария уже отображается, я удалил бит, используя помощник #render. Я тестировал оба и, должно быть, ошибочно оставил один из них без комментариев. Вы правы, перемещая removeComment до PostCommentsRoute, заставляет событие вызываться, но теперь оно дает ** новую ошибку: невозможно вызвать метод «deleteRecord» неопределенного **. Я расследую, почему. ** [скрипка] (http://jsfiddle.net/VrR2T/14/) **. Если я разрешу это, я обновлю вас. ** Спасибо за руководство **. – brg

+0

Я просмотрел событие removeComment в консоли, используя отладчик. Проблема заключается в этой строке: ** var comment = context.get ('content') **. В консоли, если я набираю ** комментарий **, он не определен. Но когда я набираю ** context **, я получаю нужный объект, который хочу уничтожить, но он не назначается переменной комментария. – brg

+0

Да, я думаю, что контекст относится к объекту, который вы передаете методу отправки, поэтому это сам комментарий. вы должны иметь возможность называть deleteRecord. –

Смежные вопросы