4

listenTo コールバックの関数引数をバインドすることは可能ですか?

これまで、削除したいラッパーメソッド「myHandler」を追加しました。

// Basic marionette layout
var view = Marionette.Layout.extend({

initialize: function() {
    // wrapping view logic inside a custom object
    this.controller = new MyViewController(); 
},

// creates a sub view and adds event handlers
someFunc: function() {
    var subView = new MySubView();

    // HERE: how to bind args for callback?
    this.listenTo(subView, "myEvent", this.myHandler, this);
}, 

// this is a dummy wrapper that I want to remove
myHandler: function(e) {
    this.controller.handleIt(this, e);
},

私がやりたいことは次のようなものです:

someFunc: function() {
    var subView = new MySubView();

    // here wrapIt binds 'this' as first argument for handleIt
    this.listenTo(subView, "myEvent",
        wrapIt(this.controller.handleIt, this), this);
}
4

4 に答える 4

2

listenTo 関数呼び出しで関数を使用しないのはなぜですか? そのようです:

// Basic marionette layout
var view = Marionette.Layout.extend({

  initialize: function() {
    // wrapping view logic inside a custom object
    this.controller = new MyViewController(); 
  },

  // creates a sub view and adds event handlers
  someFunc: function() {
    var subView = new MySubView();

    this.listenTo(subView, "myEvent", function (e) {
      this.controller.handleIt(this, e);
    }, this);
  }, 
于 2013-05-01T21:40:43.613 に答える
1

アンダースコアはバックボーンの強い依存関係です。つまり、_.bindを使用してコンテキストを設定できます。

bind _.bind(function, object, [*arguments])
関数をオブジェクトにバインドします。つまり、関数が呼び出されるたびに、この値がオブジェクトになります。必要に応じて、引数を関数に渡して事前入力します。これは、部分適用とも呼ばれます。

あなたの例は次のように書くことができます

someFunc: function() {
    var subView = new MySubView(),
        callback = _.bind(this.controller.handleIt, this);

    this.listenTo(subView, "myEvent", callback, this);
}

関数の最初の引数としてコンテキストが必要な場合は、3 番目の引数として追加します。_.bind

someFunc: function() {
    var subView = new MySubView(),
        callback = _.bind(this.controller.handleIt, this, this);

    this.listenTo(subView, "myEvent", callback, this);
}
于 2013-04-30T09:39:44.270 に答える
0

はい、JQuery $.proxy( this.controller.handler, this ) のプロキシ関数を使用してそれを行うことができます http://api.jquery.com/jQuery.proxy/のドキュメントを参照してください

于 2013-04-30T14:03:24.690 に答える