我在一个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();
},
答案 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));
});