11import  TreeNode ,  {  ITreeNodeOptions  }  from  './tree-node' 
22import  {  ignoreEnum  }  from  '../constants' 
33import  {  TreeNodeKeyType ,  IgnoreType  }  from  '../types' 
4+ import  TreeEventTarget  from  './tree-event-target' 
45
56//#region Interfaces 
67
@@ -20,39 +21,11 @@ interface IMapData {
2021 [ key : number ] : TreeNode 
2122} 
2223
23- interface  IListenersMap  { 
24-  [ eventName : string ] : Function [ ] 
25- } 
26- 
27- export  interface  IEventNames  { 
28-  'set-data' : ( )  =>  void 
29-  'visible-data-change' : ( )  =>  void 
30-  'render-data-change' : ( )  =>  void 
31-  expand : NodeGeneralListenerType 
32-  select : NodeGeneralListenerType 
33-  unselect : NodeGeneralListenerType 
34-  'selected-change' : ( 
35-  node : TreeNode  |  null , 
36-  key : TreeNodeKeyType  |  null 
37-  )  =>  void 
38-  check : NodeGeneralListenerType 
39-  uncheck : NodeGeneralListenerType 
40-  'checked-change' : ( nodes : TreeNode [ ] ,  keys : TreeNodeKeyType [ ] )  =>  void 
41- } 
42- 
4324//#endregion Interfaces 
4425
45- //#region Types 
46- 
47- type  NodeGeneralListenerType  =  ( node : TreeNode )  =>  void 
48- 
49- export  type  ListenerType < T  extends  keyof  IEventNames >  =  IEventNames [ T ] 
50- 
5126export  type  FilterFunctionType  =  ( keyword : string ,  node : TreeNode )  =>  boolean 
5227
53- //#endregion Types 
54- 
55- export  default  class  TreeStore  { 
28+ export  default  class  TreeStore  extends  TreeEventTarget  { 
5629 //#region Properties 
5730
5831 /** 树数据 */ 
@@ -73,12 +46,11 @@ export default class TreeStore {
7346 /** 当前单选选中节点 key */ 
7447 private  currentSelectedKey : TreeNodeKeyType  |  null  =  null 
7548
76-  /** 事件 listeners */ 
77-  private  listenersMap : IListenersMap  =  { } 
78- 
7949 //#endregion Properties 
8050
81-  constructor ( private  readonly  options : ITreeStoreOptions )  { } 
51+  constructor ( private  readonly  options : ITreeStoreOptions )  { 
52+  super ( ) 
53+  } 
8254
8355 /** 
8456 * Use this function to insert nodes into flatData to avoid 'maximun call stack size exceeded' error 
@@ -481,17 +453,18 @@ export default class TreeStore {
481453 // Set children visibility 
482454 let  queue  =  node . children . concat ( ) 
483455 while  ( queue . length )  { 
484-  if  ( queue [ 0 ] . expand  &&  queue [ 0 ] . children . length )  { 
485-  queue  =  queue . concat ( queue [ 0 ] . children ) 
456+  const  nodeFromQueue  =  queue . pop ( ) 
457+  if  ( ! nodeFromQueue )  continue 
458+  if  ( nodeFromQueue . expand  &&  nodeFromQueue . children . length )  { 
459+  queue  =  nodeFromQueue . children . concat ( queue ) 
486460 } 
487-  if  ( queue [ 0 ] . _filterVisible  ===  false )  { 
488-  queue [ 0 ] . visible  =  false 
461+  if  ( nodeFromQueue . _filterVisible  ===  false )  { 
462+  nodeFromQueue . visible  =  false 
489463 }  else  { 
490-  queue [ 0 ] . visible  = 
491-  queue [ 0 ] . _parent  ===  null  || 
492-  ( queue [ 0 ] . _parent . expand  &&  queue [ 0 ] . _parent . visible ) 
464+  nodeFromQueue . visible  = 
465+  nodeFromQueue . _parent  ===  null  || 
466+  ( nodeFromQueue . _parent . expand  &&  nodeFromQueue . _parent . visible ) 
493467 } 
494-  queue . shift ( ) 
495468 } 
496469
497470 if  ( triggerEvent )  { 
@@ -1173,58 +1146,4 @@ export default class TreeStore {
11731146 } 
11741147
11751148 //#endregion Utils 
1176- 
1177-  //#region Mini EventTarget 
1178-  on < T  extends  keyof  IEventNames > ( 
1179-  eventName : T , 
1180-  listener : ListenerType < T >  |  Array < ListenerType < T > > 
1181-  ) : void   { 
1182-  if  ( ! this . listenersMap [ eventName ] )  { 
1183-  this . listenersMap [ eventName ]  =  [ ] 
1184-  } 
1185-  let  listeners : Array < ListenerType < T > >  =  [ ] 
1186-  if  ( ! Array . isArray ( listener ) )  { 
1187-  listeners  =  [ listener ] 
1188-  }  else  { 
1189-  listeners  =  listener 
1190-  } 
1191-  listeners . forEach ( listener  =>  { 
1192-  if  ( this . listenersMap [ eventName ] . indexOf ( listener )  ===  - 1 )  { 
1193-  this . listenersMap [ eventName ] . push ( listener ) 
1194-  } 
1195-  } ) 
1196-  } 
1197- 
1198-  off < T  extends  keyof  IEventNames > ( 
1199-  eventName : T , 
1200-  listener ?: ListenerType < T > 
1201-  ) : void   { 
1202-  if  ( ! this . listenersMap [ eventName ] )  return 
1203-  if  ( ! listener )  { 
1204-  this . listenersMap [ eventName ]  =  [ ] 
1205-  }  else  { 
1206-  const  index  =  this . listenersMap [ eventName ] . indexOf ( listener ) 
1207-  if  ( index  >  - 1 )  { 
1208-  this . listenersMap [ eventName ] . splice ( index ,  1 ) 
1209-  } 
1210-  } 
1211-  } 
1212- 
1213-  emit < T  extends  keyof  IEventNames > ( 
1214-  eventName : T , 
1215-  ...args : Parameters < IEventNames [ T ] > 
1216-  ) : void   { 
1217-  if  ( ! this . listenersMap [ eventName ] )  return 
1218-  const  length : number  =  this . listenersMap [ eventName ] . length 
1219-  for  ( let  i : number  =  0 ;  i  <  length ;  i ++ )  { 
1220-  this . listenersMap [ eventName ] [ i ] ( ...args ) 
1221-  } 
1222-  } 
1223- 
1224-  disposeListeners ( ) : void   { 
1225-  for  ( const  eventName  in  this . listenersMap )  { 
1226-  this . listenersMap [ eventName ]  =  [ ] 
1227-  } 
1228-  } 
1229-  //#endregion Mini EventTarget 
12301149} 
0 commit comments