ViewEvent.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /**
  2. * 视图事件类,负责处理view与mediator之间的事件监听和派发
  3. * @author Yue
  4. */
  5. import BaseMediator from "./BaseMediator";
  6. export default class ViewEvent{
  7. /** 事件列表 */
  8. private _eventList: __ViewEvent__[];
  9. public constructor() {
  10. // 初始化事件列表
  11. this._eventList = [];
  12. }
  13. /**
  14. * 注册事件
  15. * @param {string} name 事件名称
  16. * @param {(any)=>void} cb 事件回调
  17. * @param {BaseMediator} target 绑定事件的对象
  18. */
  19. public on(name: string, cb: (body: any)=>void, target: BaseMediator): void {
  20. let event = new __ViewEvent__(name, cb, target);
  21. for (let e of this._eventList) {
  22. if (e.equals(event)) {
  23. console.log("事件[" + name + "]已存在!");
  24. return;
  25. }
  26. }
  27. this._eventList.push(event);
  28. }
  29. /**
  30. * 派发事件
  31. * @param {string} name 事件名称
  32. * @param {Object} body 事件参数,动态参数列表
  33. */
  34. public emit(name: string, body?: any): void {
  35. for (let e of this._eventList) {
  36. if (e.name === name) {
  37. e.cb && e.cb.call(e.target, body);
  38. break;
  39. }
  40. }
  41. }
  42. /**
  43. * 移除指定事件
  44. * @param {string} name 事件名称
  45. * @return {boolean} 是否移除
  46. */
  47. public remove(name: string): boolean {
  48. // 移除指定事件
  49. for (let i = 0; i < this._eventList.length; i++) {
  50. if (name === this._eventList[i].name) {
  51. this._eventList.splice(i, 1);
  52. return true;
  53. }
  54. }
  55. return false;
  56. }
  57. /**
  58. * 销毁接口
  59. */
  60. public destroy(): void {
  61. }
  62. }
  63. /**
  64. * 事件对象结构,用于内部使用。
  65. * @private
  66. */
  67. class __ViewEvent__ {
  68. /** 事件名称 */
  69. public name: string;
  70. /** 事件回调 */
  71. public cb: (...args)=>void;
  72. /** 绑定事件的对象 */
  73. public target: BaseMediator;
  74. /***
  75. * @param {string} name 事件名称
  76. * @param {(...args)=>void} cb 事件回调
  77. * @param {BaseMediator} target 绑定事件的对象
  78. */
  79. public constructor(name: string, cb: (...args)=>void, target: BaseMediator) {
  80. this.name = name;
  81. this.cb = cb;
  82. this.target = target;
  83. }
  84. /**
  85. * 判断两个对象是否相等
  86. * @param {__ViewEvent__} event 目标事件对象
  87. * @return {boolean} 是否相等
  88. */
  89. public equals(event: __ViewEvent__): boolean {
  90. return this.name === event.name;
  91. }
  92. }