2013-03-27 4 views
1

Как ответ на мой предыдущий question, я узнал, что привязка между двумя контроллерами - это плохой дизайн. Я попытался решить проблему с обработкой событий.Как отправить событие на другие виды

App.TestView = Ember.CollectionView.extend({  
tagName:'tbody', 
contentBinding: 'this.controller.content', 
itemViewClass: Em.View.extend({ 
    templateName:'test', 
    classNameBindings:['selected:selected'], 
    selectedBinding: 'content.selected', 
    click: function(event){ 
    var controller = this.get('controller'); 
    this.resetSelection(); 
    this.content.set('selected',true); 
    router = this.get('controller.target.router'); 
    router.transitionTo('inc.index',this.content); 
    // just sends it to the parentView 
    controller.send('noHide',false); 
    } 
}) 
}); 
App.MainMenuView = Em.View.extend({ 
noHide: function(event){ 
this.get('controller').set('isHidden',false); 
} 
}) 

Но теперь я не знаю, как отправлять события другим представлениям или другим маршрутам, которые не являются родительским. Я просто хочу переключить скрытый элемент меню, когда я нажимаю на строку таблицы.

ответ

0

Хорошо, я понял это сам. Вот решение:

App.TableController = Em.ArrayController.extend({ 
needs: ['mainMenu'], 
hidden:true, 
hiddenBinding: 'controllers.mainMenu.isHidden', 
    noHide: function(test){ 
    this.get('controllers.mainMenu').changeHidden(test); 
} 
}) 
App.MainMenuController= Em.Controller.extend({ 
isHidden: true, 
changeHidden: function(test){ 
this.set('isHidden',test) 
} 
}); 

Событие делегировано контроллеру parentView. Оттуда я получил ссылку на мой mainMenuController через «needs», чтобы вызвать функцию changeHidden.

1

Вы можете использовать Ember.Instrumentation для вызова любого контроллера из другого места.

Сначала подпишитесь на мероприятие в setupController, вы можете выбрать любое имя, которое хотите для мероприятия, и назвать нужную функцию в обработчике. Полезная нагрузка не является обязательной.

App.MyRoute = Ember.Route.extend({ 
    setupController: function (controller, model) { 
    Ember.Instrumentation.subscribe("app.myEventName", { 
     before: function (name, timestamp, payload) { 
     controller.send('functionToCall', payload); 
     }, 
     after: function() { } 
    }); 
    } 
}); 

Если вы хотите, чтобы вызвать функцию, выполните следующее

Ember.Instrumentation.instrument('app.myEventName', myPayload); 

Вы можете прочитать здесь http://emberjs.com/api/classes/Ember.Instrumentation.html

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