@@ -8,6 +8,36 @@ class EventManagment extends JSEventManagment {
8
8
$once = super . once
9
9
}
10
10
11
+ function bindEvents ( obj : any , from : string , to : string ) : void {
12
+ let evts = obj [ from ] ;
13
+ if ( evts ) {
14
+ obj [ to ] = { }
15
+ for ( var k in evts ) {
16
+ obj [ to ] [ k ] = ~ evts [ k ] . name . indexOf ( 'bound ' ) ? evts [ k ] : evts [ k ] . bind ( this )
17
+ }
18
+ }
19
+ }
20
+
21
+ function addEventListener ( event : string , handler : Function , isOnce : boolean = false ) : void {
22
+ Vue . prototype . $events [ isOnce ? 'once' : 'on' ] ( event , handler )
23
+ }
24
+
25
+ function addEventListeners ( obj : { [ key : string ] : Function } , isOnce : boolean = false ) : void {
26
+ if ( obj ) {
27
+ for ( var k in obj ) {
28
+ addEventListener ( k , obj [ k ] , isOnce )
29
+ }
30
+ }
31
+ }
32
+
33
+ function removeEventListeners ( obj : { [ key : string ] : Function } ) {
34
+ if ( obj ) {
35
+ for ( var k in obj ) {
36
+ Vue . prototype . $events . off ( k , obj [ k ] )
37
+ }
38
+ }
39
+ }
40
+
11
41
const eventsPlugins : PluginFunction < any > = ( Vue ) => {
12
42
const eventManagement = new EventManagment ( ) ;
13
43
Object . defineProperties ( Vue . prototype , {
@@ -21,31 +51,19 @@ const eventsPlugins: PluginFunction<any> = (Vue) => {
21
51
Vue . mixin ( {
22
52
beforeCreate ( ) {
23
53
let $this : any = this ;
24
- let evts = $this . $options . on ;
25
- if ( evts ) {
26
- $this . $options . $setEvents = { }
27
- for ( var k in evts ) {
28
- $this . $options . $setEvents [ k ] = ~ evts [ k ] . name . indexOf ( 'bound ' ) ? evts [ k ] : evts [ k ] . bind ( this )
29
- }
30
- }
54
+ let options = $this . $options ;
55
+ bindEvents ( options , 'on' , '$setEventsOn' )
56
+ bindEvents ( options , 'once' , '$setEventsOnce' )
31
57
} ,
32
58
created ( ) {
33
59
let $this : any = this ;
34
- let evts = $this . $options . $setEvents ;
35
- if ( evts ) {
36
- for ( var k in evts ) {
37
- Vue . prototype . $events . on ( k , evts [ k ] )
38
- }
39
- }
60
+ addEventListeners ( $this . $options . $setEventsOn , false )
61
+ addEventListeners ( $this . $options . $setEventsOnce , true )
40
62
} ,
41
63
beforeDestroy ( ) {
42
64
let $this : any = this ;
43
- let evts = $this . $options . $setEvents ;
44
- if ( evts ) {
45
- for ( var k in evts ) {
46
- Vue . prototype . $events . off ( k , evts [ k ] )
47
- }
48
- }
65
+ removeEventListeners ( $this . $options . $setEventsOn )
66
+ removeEventListeners ( $this . $options . $setEventsOnce )
49
67
}
50
68
} )
51
69
}
@@ -75,6 +93,9 @@ declare module 'vue/types/options' {
75
93
on ?: {
76
94
[ key : string ] : Function
77
95
}
96
+ once ?: {
97
+ [ key : string ] : Function
98
+ }
78
99
}
79
100
}
80
101
0 commit comments