我想知道綁定到事件的方法是異步調用還是不在JavaScript中?在我的情況下,我使用Backbone.js來構建一個應用程序。我使用事件聚合器在視圖之間進行通信。方法綁定到異步調用的事件還是不在Javascript/Backbone.js中?
如果我有一個觸發事件的方法,在調用觸發事件的方法的其餘部分運行之前,其他視圖中綁定到該事件的方法會完成嗎?
事件聚合如下:
var eventAggrigator = _.extend({}, Backbone.Events);
eventAggrigator.on('submitContactEditForm', function() {
console.log('Contact edit form submit event triggered');
});
函數調用該觸發事件(該功能從ViewA調用):
saveContact: function(event) {
var self = this;
// Prevent submit event trigger from firing.
event.preventDefault();
// Trigger form submit event.
eventAggrigator.trigger('submitContactEditForm');
// Update model with form values.
this.updateContact();
// Save contact to database.
this.model.save({
success: function(model, response) {
console.log('Contact ' + self.model.get('surname') + ' saved');
},
error: function(model, response) {
throw error = new Error('Error occured while saving contact.');
}
});
},
ViewB綁定到事件 'submitContactEditForm' (參見下文ViewB的相關代碼):
initialize: function() {
_.bindAll(this, 'addSortableFields', 'appendNewField', 'getFieldsHtml', 'removeField', 'render', 'setEmailValues');
// Bind to event aggregator.
eventAggrigator.bind('submitContactEditForm', this.setEmailValues);
this.model = this.options.model;
},
setEmailValues: function() {
// Extract email form values.
var emails = _.clone(this.model.get('email'));
var emailFields = this.$('.email-field');
_.each(emails, function(email, index) {
email.value = emailFields.eq(index).val();
});
this.model.set('email', emails);
},
所以問題是,ViewB.setEmailValues()會在執行ViewA.saveContact()中的this.model.save()之前總是完成嗎?
如果你查找'trigger'的源代碼:http://documentcloud.github.com/backbone/backbone.js,你可以看到它只是簡單的調用了綁定的回調函數。 – biziclop