2017-01-25 14 views
1

私は1つのjsファイルLoadSolutionViewに関数(getHealth)を持ち、パーセンテージを返します。私OverviewViewファイルでバックボーンイベントリスナーコールバック関数からの戻り値を取得

function getHealth(dow) { 
     Main.Views.LoadSolutionView.getHealth(dow); 
} 
Main.EventAggregator.listenTo(Main.Views.OverviewView, 'getHealth', getHealth); 

を次のように私はこの機能のためのイベントリスナーを持って、ページの読み込みのエントリポイントとして、私は正常にgetHealth機能をトリガし、次の機能を別のJSファイルで

を持っていますが、戻り値は得られませんが、代わりにすべての子がthisになります。返された値がgetHealth関数をトリガするのを取得する方法はありますか?

saveRooms: function(dayId, solutionId, shiftId, day) { 
    var self = this; 

    var roomIds = self.getIds('roomsEdit'); 
    roomIds = _.map(roomIds, Number); 

    this.trigger('editShiftDay', this.solution, this.dto, this.numDays, this.endDate, solutionId, dayId, day); 

    var percentage = this.trigger('getHealth', dayId); 

    this.hideOptions(); 

    this.checkForChanges(); 
}, 
+1

「this」のみを使用すると、なぜ「this」に「self」を割り当てるのでしょうか? '$(これ)'ではない? – Lucas

+0

私は自分自身を使用する必要があるループを使用する場合、それは習慣の力です。 '$(this)'を使うと関数が起動しないので、 'this'を使うのが正しいと信じています – mcclosa

+0

' $(this) 'について何を考えているのか分かりません。 – Lucas

答えて

2

バックボーンイベントtrigger機能は、目的を連鎖ためthisを返します。

イベントは、関数呼び出しのようなものではありません。コードを聞くことができるコードも、複数のリスナーがそのイベントにバインドされている可能性もあるので、戻り値は意味をなさないでしょう。

強力な結合を避けるためにイベントを使用するとよいでしょう。イベントをトリガーするビューにデータが必要な場合は、使用できるパターンがいくつかあります。

は、機能のbindメソッドを使用してイベント

onHealthCallback: function(health) { 
    /* use health here */ 
}, 

saveRooms: function(dayId, solutionId, shiftId, day) { 
    /* ... */ 
    this.trigger('getHealth', dayId, this.onHealthCallback.bind(this)); 
    /* ... */ 
}, 

でコールバックを渡し、thisonHealthCallbackで利用できるようになります。

リスナーは、あなたが期待している引数を渡すだけでコールバックを呼び出すことができます。

this.listenTo(OverviewView, 'getHealth', function(dayId, callback) { 
    callback(LoadSolutionView.getHealth(dayId)); 
}); 

setHealth: function(health) { 
    this.health = health; 
    this.reactToHealhChange(); 
}, 

saveRooms: function(dayId, solutionId, shiftId, day) { 
    /* ... */ 
    this.trigger('getHealth', dayId, this); 
    /* ... */ 
}, 

bindビューを渡し、我々は全体のインスタンスを渡しているので、不要です。

リスナーは完全なビューにアクセスできるようになりました。

this.listenTo(OverviewView, 'getHealth', function(dayId, view) { 
    view.setHealth(LoadSolutionView.getHealth(dayId)); 
}); 
+0

これは素晴らしい仕事でした、ありがとう! – mcclosa

関連する問題