1

作为我上一个问题的答案,我了解到两个控制器之间的绑定是一种糟糕的设计。我试图通过事件处理来解决它。

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);
 }
})

但是现在我不知道如何将事件发送到其他视图或不是父视图的其他路由。当我单击表格的一行时,我只想切换隐藏的菜单项。

4

2 回答 2

1

您可以使用Ember.Instrumentation从其他任何地方调用任何控制器。

首先订阅 中的事件setupController,您可以为事件选择所需的名称并在 before 处理程序中调用所需的函数。有效载荷是可选的。

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

于 2013-03-27T16:07:26.750 回答
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 的链接,以调用 changeHidden 函数。

于 2013-03-27T15:35:22.263 回答