123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- /**
- * 视图事件类,负责处理view与mediator之间的事件监听和派发
- * @author Yue
- */
- import BaseMediator from "./BaseMediator";
- export default class ViewEvent{
- /** 事件列表 */
- private _eventList: __ViewEvent__[];
- public constructor() {
- // 初始化事件列表
- this._eventList = [];
- }
- /**
- * 注册事件
- * @param {string} name 事件名称
- * @param {(any)=>void} cb 事件回调
- * @param {BaseMediator} target 绑定事件的对象
- */
- public on(name: string, cb: (body: any)=>void, target: BaseMediator): void {
- let event = new __ViewEvent__(name, cb, target);
- for (let e of this._eventList) {
- if (e.equals(event)) {
- console.log("事件[" + name + "]已存在!");
- return;
- }
- }
- this._eventList.push(event);
- }
- /**
- * 派发事件
- * @param {string} name 事件名称
- * @param {Object} body 事件参数,动态参数列表
- */
- public emit(name: string, body?: any): void {
- for (let e of this._eventList) {
- if (e.name === name) {
- e.cb && e.cb.call(e.target, body);
- break;
- }
- }
- }
- /**
- * 移除指定事件
- * @param {string} name 事件名称
- * @return {boolean} 是否移除
- */
- public remove(name: string): boolean {
- // 移除指定事件
- for (let i = 0; i < this._eventList.length; i++) {
- if (name === this._eventList[i].name) {
- this._eventList.splice(i, 1);
- return true;
- }
- }
- return false;
- }
- /**
- * 销毁接口
- */
- public destroy(): void {
- }
- }
- /**
- * 事件对象结构,用于内部使用。
- * @private
- */
- class __ViewEvent__ {
- /** 事件名称 */
- public name: string;
- /** 事件回调 */
- public cb: (...args)=>void;
- /** 绑定事件的对象 */
- public target: BaseMediator;
- /***
- * @param {string} name 事件名称
- * @param {(...args)=>void} cb 事件回调
- * @param {BaseMediator} target 绑定事件的对象
- */
- public constructor(name: string, cb: (...args)=>void, target: BaseMediator) {
- this.name = name;
- this.cb = cb;
- this.target = target;
- }
- /**
- * 判断两个对象是否相等
- * @param {__ViewEvent__} event 目标事件对象
- * @return {boolean} 是否相等
- */
- public equals(event: __ViewEvent__): boolean {
- return this.name === event.name;
- }
- }
|