2013-03-27 72 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的控制器。從那裏我通過'needs'獲得了我的mainMenuController的鏈接來調用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

相關問題