1
1
import format from './format.js' ;
2
+ import { trigger } from './utils'
2
3
3
4
/**
4
5
* Event handler
5
- * @param {HTMLInputElement } target
6
- */
7
- function handler ( { target} ) {
8
- let { previousValue, mask} = target . dataset ;
9
-
10
- // do nothing if mask is not specified
11
- if ( ! mask ) return ;
12
-
13
- if ( typeof previousValue === 'string' && previousValue . length < target . value . length ) {
14
- target . value = format ( target . value , mask ) ;
15
- }
16
-
17
- target . dataset . previousValue = target . value ;
18
- }
19
-
20
- /**
21
- * Fires on bind handler
22
6
* @param {HTMLInputElement } el
23
- * @param {String } mask
7
+ * @param {Boolean } force
24
8
*/
25
- function bindHandler ( el , mask ) {
26
- el . dataset . mask = mask ;
27
-
28
- //add event listener
29
- el . addEventListener ( 'input' , handler , false ) ;
9
+ function updateValue ( el , force = false ) {
10
+ let { value, dataset : { previousValue, mask } } = el ;
30
11
31
- // run format function right after bind
32
- handler ( { target : el } )
33
- }
12
+ if ( force || ( value && value !== previousValue && value . length > previousValue . length ) ) {
13
+ el . value = format ( value , mask ) ;
14
+ trigger ( el , 'input' )
15
+ }
34
16
35
- /**
36
- * Fires on unbind handler
37
- * @param {HTMLInputElement } el
38
- */
39
- function unbindHandler ( el ) {
40
- el . removeEventListener ( 'input' , handler , false ) ;
17
+ el . dataset . previousValue = value ;
41
18
}
42
19
43
20
/**
44
21
* Fires on handler update
45
22
* @param {HTMLInputElement } el
46
23
* @param {String } mask
47
24
*/
48
- function updateHandler ( el , mask ) {
25
+ function updateMask ( el , mask ) {
49
26
// change format
50
27
el . dataset . mask = mask ;
51
-
52
- // run format function with new mask
53
- el . value = format ( el . value , mask ) ;
54
28
}
55
29
56
30
@@ -69,14 +43,10 @@ export default function (Vue) {
69
43
* @param {?String } value
70
44
*/
71
45
bind ( el , { value} ) {
72
- bindHandler ( el , value ) ;
46
+ updateMask ( el , value ) ;
47
+ updateValue ( el ) ;
73
48
} ,
74
49
75
- /**
76
- * Called only once, when the directive is unbound from the element.
77
- */
78
- unbind : unbindHandler ,
79
-
80
50
/**
81
51
* Called after the containing component has updated,
82
52
* but possibly before its children have updated.
@@ -88,11 +58,17 @@ export default function (Vue) {
88
58
* @param {?String } value
89
59
* @param {?String } oldValue
90
60
*/
91
- update ( el , { value, oldValue} ) {
92
- // if mask was not changed - do nothing
93
- if ( value === oldValue ) return ;
61
+ componentUpdated ( el , { value, oldValue} ) {
62
+
63
+ let isMaskChanged = value !== oldValue ;
64
+
65
+ // update mask first if changed
66
+ if ( isMaskChanged ) {
67
+ updateMask ( el , value ) ;
68
+ }
94
69
95
- updateHandler ( el , value )
70
+ // update value
71
+ updateValue ( el , isMaskChanged ) ;
96
72
}
97
73
} ) ;
98
74
} ;
0 commit comments