OnFuncCenter.ts 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. type ListenerFunc = (...args: any) => void
  2. class EventData {
  3. public listener!: ListenerFunc;
  4. public object: any;
  5. }
  6. /**委托事件,适用于不是频繁订阅删除*/
  7. export class OnFuncCenter {
  8. public static Creat():OnFuncCenter{return new OnFuncCenter()};
  9. private _events: Array<EventData>;
  10. constructor() {
  11. this._events = [];
  12. }
  13. clean():void{
  14. this._events=[];
  15. }
  16. /**
  17. * 注册事件
  18. * @param listener 处理事件的侦听器函数
  19. * @param object 侦听函数绑定的作用域对象
  20. */
  21. on(listener: ListenerFunc, object: object) {
  22. let list: Array<EventData> = this._events;
  23. let length = list.length;
  24. for (let i = 0; i < length; i++) {
  25. let bin = list[i];
  26. if (bin.listener == listener && bin.object==object) {
  27. console.warn(listener,"same!");
  28. return;
  29. }
  30. }
  31. let data: EventData = new EventData();
  32. data.listener = listener;
  33. data.object = object;
  34. list.push(data);
  35. }
  36. /**
  37. * 监听一次事件,事件响应后,该监听自动移除
  38. * @param listener 事件触发回调方法
  39. * @param object 侦听函数绑定的作用域对象
  40. */
  41. once(listener: ListenerFunc, object: object) {
  42. let _listener: any = (...$args: any) => {
  43. this.off(_listener,object);
  44. _listener = null;
  45. listener.call(object,...$args);
  46. }
  47. this.on(_listener, object);
  48. }
  49. /**
  50. * 移除事件
  51. * @param listener 处理事件的侦听器函数
  52. * @param object 侦听函数绑定的作用域对象
  53. */
  54. off(listener: ListenerFunc,object:object) {
  55. let list: Array<EventData> = this._events;
  56. let length = list.length;
  57. for (let i = 0; i < length; i++) {
  58. let bin: EventData = list[i];
  59. if (bin.listener == listener && bin.object == object) {
  60. list.splice(i, 1);
  61. break;
  62. }
  63. }
  64. }
  65. /**
  66. * 触发事件
  67. * @param args(any) 事件参数
  68. */
  69. call(...args: any) {
  70. let list: Array<EventData> = this._events;
  71. let temp: Array<EventData> = list.concat();
  72. let length = temp.length;
  73. for (let i = 0; i < length; i++) {
  74. let eventBin = temp[i];
  75. eventBin.listener.call(eventBin.object,...args);
  76. }
  77. }
  78. }
  79. class Event<T> {
  80. public listener!: (data:T) => void;
  81. public object: any;
  82. }
  83. /**委托事件,泛型约束参数,适用于不是频繁订阅删除*/
  84. export class OnFuncT<T> {
  85. private _events: Array<Event<T>>;
  86. constructor() {
  87. this._events = [];
  88. }
  89. clean():void{
  90. this._events=[];
  91. }
  92. /**
  93. * 注册事件
  94. * @param listener 处理事件的侦听器函数
  95. * @param object 侦听函数绑定的作用域对象
  96. */
  97. on(listener: (data:T) => void, object: object) {
  98. let list: Array<Event<T>> = this._events;
  99. let length = list.length;
  100. for (let i = 0; i < length; i++) {
  101. let bin = list[i];
  102. if (bin.listener == listener && bin.object==object) {
  103. console.warn(listener,"same!");
  104. return;
  105. }
  106. }
  107. let data:Event<T> = new Event<T>;
  108. data.listener = listener;
  109. data.object = object;
  110. list.push(data);
  111. }
  112. /**
  113. * 监听一次事件,事件响应后,该监听自动移除
  114. * @param listener 事件触发回调方法
  115. * @param object 侦听函数绑定的作用域对象
  116. */
  117. once(listener: (data:T) => void, object: object) {
  118. let _listener: any = (data:T) => {
  119. this.off(_listener,object);
  120. _listener = null;
  121. listener.call(object,data);
  122. }
  123. this.on(_listener, object);
  124. }
  125. /**
  126. * 移除事件
  127. * @param listener 处理事件的侦听器函数
  128. * @param object 侦听函数绑定的作用域对象
  129. */
  130. off(listener:(data:T) => void ,object:object) {
  131. let list: Array<Event<T>> = this._events;
  132. let length = list.length;
  133. for (let i = 0; i < length; i++) {
  134. let bin:Event<T> = list[i];
  135. if (bin.listener == listener && bin.object == object) {
  136. list.splice(i, 1);
  137. break;
  138. }
  139. }
  140. }
  141. /**
  142. * 触发事件
  143. * @param args(any) 事件参数
  144. */
  145. call(data:T) {
  146. let list: Array<Event<T>> = this._events;
  147. let temp: Array<Event<T>> = list.concat();
  148. let length = temp.length;
  149. for (let i = 0; i < length; i++) {
  150. let eventBin = temp[i];
  151. eventBin.listener.call(eventBin.object,data);
  152. }
  153. }
  154. }