Skip to content
This repository was archived by the owner on Sep 4, 2024. It is now read-only.

Commit 7befd5c

Browse files
author
Max Lyashuk
committed
[#16] [#18] Fixed issues with v-model
- Fixed issue with excessive chars inside model data - Simplified directive by removing custom event listeners
1 parent 454ee3f commit 7befd5c

File tree

2 files changed

+34
-46
lines changed

2 files changed

+34
-46
lines changed

src/index.js

+22-46
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,30 @@
11
import format from './format.js';
2+
import { trigger } from './utils'
23

34
/**
45
* 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
226
* @param {HTMLInputElement} el
23-
* @param {String} mask
7+
* @param {Boolean} force
248
*/
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;
3011

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+
}
3416

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;
4118
}
4219

4320
/**
4421
* Fires on handler update
4522
* @param {HTMLInputElement} el
4623
* @param {String} mask
4724
*/
48-
function updateHandler(el, mask){
25+
function updateMask(el, mask) {
4926
// change format
5027
el.dataset.mask = mask;
51-
52-
// run format function with new mask
53-
el.value = format(el.value, mask);
5428
}
5529

5630

@@ -69,14 +43,10 @@ export default function (Vue) {
6943
* @param {?String} value
7044
*/
7145
bind (el, {value}) {
72-
bindHandler(el, value);
46+
updateMask(el, value);
47+
updateValue(el);
7348
},
7449

75-
/**
76-
* Called only once, when the directive is unbound from the element.
77-
*/
78-
unbind: unbindHandler,
79-
8050
/**
8151
* Called after the containing component has updated,
8252
* but possibly before its children have updated.
@@ -88,11 +58,17 @@ export default function (Vue) {
8858
* @param {?String} value
8959
* @param {?String} oldValue
9060
*/
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+
}
9469

95-
updateHandler(el, value)
70+
// update value
71+
updateValue(el, isMaskChanged);
9672
}
9773
});
9874
};

src/utils/index.js

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Notifies Vue about internal value change
3+
* @see https://github.com/vuejs/Discussion/issues/157#issuecomment-273301588
4+
*
5+
* @param {HTMLInputElement} el
6+
* @param {String} type
7+
*/
8+
export const trigger = (el, type) => {
9+
const e = document.createEvent('HTMLEvents');
10+
e.initEvent(type, true, true);
11+
el.dispatchEvent(e)
12+
};

0 commit comments

Comments
 (0)