1

以前の質問に対する答えとして、 2 つのコントローラー間のバインドは一種の悪い設計であることがわかりました。イベント処理で解決しようとしました。

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 に答える