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