从Backbone事件侦听器回调函数

时间:2017-01-25 11:36:21

标签: javascript backbone.js backbone-events

我在一个js文件getHealth中有一个函数(LoadSolutionView)来返回一个百分比。

在另一个JS文件中作为页面加载的入口点,我有一个这个函数的事件监听器,如下所示

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

在我的OverviewView文件中,我有以下函数成功触发getHealth函数,但我没有得到返回值,而是得到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 个答案:

答案 0 :(得分:2)

Backbone Events trigger函数返回this以进行链接。

事件与函数调用不同。请记住,没有代码可以监听它,或者多个侦听器可以绑定到该事件,因此返回值没有任何意义。

使用事件来避免强耦合是很好的。如果触发事件的视图需要返回某些数据,则可以使用一些模式。

使用事件

传递回调
onHealthCallback: function(health) {
    /* use health here */
},

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

使用功能的bind方法,this将提供onHealthCallback

然后,监听器可以调用回调传递你期望的参数。

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