2017-01-25 6 views
1

У меня есть функция (getHealth) в одном файле js 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

Зачем присваивать 'self' как' this', если вы используете только 'this'? Не '$ (это)' ?? – Lucas

+0

Это привычка, если я когда-либо использую петли, мне нужно использовать себя. Использование '$ (this)' не запускает функцию, поэтому я считаю, что я правильно использую 'this' – mcclosa

+0

. Я не знаю, что я думал о' $ (this) ', извините. – Lucas

ответ

2

системообразующего Событие trigger функция возвращает this для построения цепочки целей.

Событие не похоже на вызов функции. Имейте в виду, что ни один код не может его прослушать, или что несколько слушателей могут быть связаны с этим событием, поэтому возвращаемое значение не имеет смысла.

Полезно использовать события, чтобы избежать сильной связи. Если представление, инициирующее событие, нуждается в некоторых данных назад, есть некоторые шаблоны, которые вы можете использовать.

Pass обратного вызова с событием

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

Это сработало отлично, спасибо! – mcclosa