Backbone.js事件触发 #
一、trigger方法 #
1.1 基本用法 #
javascript
var obj = _.extend({}, Backbone.Events);
obj.on('alert', function(message) {
console.log('Alert:', message);
});
obj.trigger('alert', 'Hello World');
1.2 触发多个事件 #
javascript
obj.on('event1', function() { console.log('Event 1'); });
obj.on('event2', function() { console.log('Event 2'); });
obj.trigger('event1 event2');
1.3 传递参数 #
javascript
obj.on('custom', function(a, b, c) {
console.log(a, b, c);
});
obj.trigger('custom', 1, 2, 3);
1.4 返回值 #
javascript
var result = obj.trigger('alert', 'Hello');
console.log(result === obj);
二、事件参数 #
2.1 单个参数 #
javascript
obj.on('greet', function(name) {
console.log('Hello, ' + name);
});
obj.trigger('greet', 'World');
2.2 多个参数 #
javascript
obj.on('calculate', function(a, b, operator) {
var result;
switch (operator) {
case '+': result = a + b; break;
case '-': result = a - b; break;
case '*': result = a * b; break;
}
console.log(result);
});
obj.trigger('calculate', 10, 5, '+');
2.3 对象参数 #
javascript
obj.on('save', function(data) {
console.log('保存数据:', data);
});
obj.trigger('save', {
id: 1,
name: '张三',
email: 'zhangsan@example.com'
});
2.4 事件对象模式 #
javascript
obj.on('user:action', function(event) {
console.log('用户:', event.user);
console.log('动作:', event.action);
console.log('时间:', event.timestamp);
});
obj.trigger('user:action', {
user: '张三',
action: 'login',
timestamp: new Date()
});
三、自定义事件 #
3.1 命名约定 #
javascript
obj.on('user:login', function(user) {
console.log('用户登录:', user);
});
obj.on('user:logout', function() {
console.log('用户登出');
});
obj.on('model:save:success', function(model) {
console.log('保存成功:', model);
});
obj.on('model:save:error', function(error) {
console.log('保存失败:', error);
});
3.2 事件命名空间 #
javascript
obj.on('user:created', function() {});
obj.on('user:updated', function() {});
obj.on('user:deleted', function() {});
obj.on('order:created', function() {});
obj.on('order:updated', function() {});
obj.on('order:deleted', function() {});
3.3 状态事件 #
javascript
var StateMachine = _.extend({
state: 'idle',
transition: function(newState) {
var oldState = this.state;
this.state = newState;
this.trigger('state:change', newState, oldState);
this.trigger('state:' + newState);
}
}, Backbone.Events);
StateMachine.on('state:change', function(newState, oldState) {
console.log('状态从', oldState, '变为', newState);
});
StateMachine.on('state:running', function() {
console.log('进入运行状态');
});
StateMachine.transition('running');
3.4 业务事件 #
javascript
var OrderService = _.extend({
create: function(data) {
this.trigger('order:beforeCreate', data);
var order = this.doCreate(data);
this.trigger('order:created', order);
return order;
},
cancel: function(orderId) {
this.trigger('order:beforeCancel', orderId);
var result = this.doCancel(orderId);
this.trigger('order:cancelled', orderId);
return result;
}
}, Backbone.Events);
四、事件链 #
4.1 链式触发 #
javascript
obj.on('start', function() {
console.log('开始');
obj.trigger('process');
});
obj.on('process', function() {
console.log('处理中');
obj.trigger('complete');
});
obj.on('complete', function() {
console.log('完成');
});
obj.trigger('start');
4.2 条件触发 #
javascript
obj.on('validate', function(data) {
if (data.valid) {
obj.trigger('validate:success', data);
} else {
obj.trigger('validate:error', data.errors);
}
});
obj.on('validate:success', function(data) {
console.log('验证成功:', data);
});
obj.on('validate:error', function(errors) {
console.log('验证失败:', errors);
});
obj.trigger('validate', { valid: true, data: {} });
obj.trigger('validate', { valid: false, errors: ['错误1', '错误2'] });
4.3 异步事件链 #
javascript
obj.on('fetch:start', function() {
console.log('开始获取数据');
setTimeout(function() {
obj.trigger('fetch:complete', { data: [1, 2, 3] });
}, 1000);
});
obj.on('fetch:complete', function(result) {
console.log('获取完成:', result.data);
});
obj.trigger('fetch:start');
五、事件广播 #
5.1 全局事件总线 #
javascript
var EventBus = _.extend({}, Backbone.Events);
var ModuleA = {
init: function() {
EventBus.on('data:updated', this.onDataUpdated, this);
},
onDataUpdated: function(data) {
console.log('ModuleA 收到数据更新:', data);
}
};
var ModuleB = {
init: function() {
EventBus.on('data:updated', this.onDataUpdated, this);
},
onDataUpdated: function(data) {
console.log('ModuleB 收到数据更新:', data);
}
};
ModuleA.init();
ModuleB.init();
EventBus.trigger('data:updated', { id: 1, name: '张三' });
5.2 事件冒泡模拟 #
javascript
var Parent = _.extend({}, Backbone.Events);
var Child = _.extend({}, Backbone.Events);
Child.on('action', function(data) {
console.log('Child 处理:', data);
Parent.trigger('child:action', data);
});
Parent.on('child:action', function(data) {
console.log('Parent 收到子事件:', data);
});
Child.trigger('action', { type: 'click' });
5.3 事件代理 #
javascript
var EventAggregator = {
events: {},
register: function(name, obj) {
this.events[name] = obj;
},
broadcast: function(event, data) {
for (var name in this.events) {
this.events[name].trigger(event, data);
}
}
};
var module1 = _.extend({}, Backbone.Events);
var module2 = _.extend({}, Backbone.Events);
EventAggregator.register('module1', module1);
EventAggregator.register('module2', module2);
module1.on('update', function(data) {
console.log('Module1 更新:', data);
});
module2.on('update', function(data) {
console.log('Module2 更新:', data);
});
EventAggregator.broadcast('update', { value: 100 });
六、实用示例 #
6.1 通知系统 #
javascript
var NotificationService = _.extend({
notify: function(type, message) {
this.trigger('notification', {
type: type,
message: message,
timestamp: new Date()
});
},
success: function(message) {
this.notify('success', message);
},
error: function(message) {
this.notify('error', message);
},
warning: function(message) {
this.notify('warning', message);
},
info: function(message) {
this.notify('info', message);
}
}, Backbone.Events);
NotificationService.on('notification', function(notification) {
console.log('[' + notification.type + ']', notification.message);
});
NotificationService.success('操作成功');
NotificationService.error('操作失败');
6.2 进度事件 #
javascript
var ProgressTracker = _.extend({
start: function(total) {
this.total = total;
this.current = 0;
this.trigger('progress:start', { total: total });
},
update: function(increment) {
this.current += increment;
var percent = Math.round((this.current / this.total) * 100);
this.trigger('progress:update', {
current: this.current,
total: this.total,
percent: percent
});
if (this.current >= this.total) {
this.complete();
}
},
complete: function() {
this.trigger('progress:complete');
}
}, Backbone.Events);
ProgressTracker.on('progress:update', function(data) {
console.log('进度:', data.percent + '%');
});
ProgressTracker.on('progress:complete', function() {
console.log('完成!');
});
ProgressTracker.start(100);
ProgressTracker.update(30);
ProgressTracker.update(40);
ProgressTracker.update(30);
6.3 生命周期事件 #
javascript
var Component = _.extend({
initialize: function(options) {
this.trigger('before:init', options);
this.options = options;
this.setup();
this.trigger('init', this);
},
setup: function() {
this.trigger('setup');
},
destroy: function() {
this.trigger('before:destroy');
this.cleanup();
this.trigger('destroy');
this.off();
},
cleanup: function() {
this.trigger('cleanup');
}
}, Backbone.Events);
Component.on('before:init', function(options) {
console.log('初始化前:', options);
});
Component.on('init', function(component) {
console.log('初始化完成');
});
Component.on('before:destroy', function() {
console.log('销毁前');
});
Component.on('destroy', function() {
console.log('已销毁');
});
Component.initialize({ debug: true });
Component.destroy();
七、总结 #
7.1 trigger方法 #
| 特性 | 说明 |
|---|---|
| 参数传递 | 支持多个参数 |
| 返回值 | 返回对象本身 |
| 链式调用 | 支持链式触发 |
7.2 最佳实践 #
- 使用命名空间组织事件
- 使用事件对象传递复杂数据
- 避免过度使用事件链
- 合理使用全局事件总线
- 文档化自定义事件
最后更新:2026-03-28