从 Backbone 事件侦听器回调函数中获取 return 值

Get return value from a Backbone event listener callback function

我在一个 js 文件中有一个函数 (getHealth) LoadSolutionView 到 return 一个百分比。

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

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

在我的 OverviewView 文件中,我有以下函数可以成功触发 getHealth 函数,但我没有得到 returned 值,而是得到了 this。有没有办法通过触发 getHealth 函数获得 returned 值?

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

Backbone 事件 trigger 函数 returns this 用于链接目的。

事件不像函数调用。请记住,没有代码可以监听它,或者多个监听器可以绑定到该事件,因此 return 值没有意义。

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

通过事件传递回调

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