|
1 | 1 | /* @flow */ |
2 | 2 |
|
| 3 | +import { cached } from 'shared/util' |
3 | 4 | import { warn } from 'core/util/index' |
4 | 5 |
|
| 6 | +const normalizeEvent = cached((name: string): { |
| 7 | + name: string, |
| 8 | + once: boolean, |
| 9 | + capture: boolean |
| 10 | +} => { |
| 11 | + const once = name.charAt(0) === '~' // Prefixed last, checked first |
| 12 | + name = once ? name.slice(1) : name |
| 13 | + const capture = name.charAt(0) === '!' |
| 14 | + name = capture ? name.slice(1) : name |
| 15 | + return { |
| 16 | + name, |
| 17 | + once, |
| 18 | + capture |
| 19 | + } |
| 20 | +}) |
| 21 | + |
| 22 | +function createEventHandle (fn: Function | Array<Function>): { |
| 23 | + fn: Function | Array<Function>; |
| 24 | + invoker: Function; |
| 25 | +} { |
| 26 | + const handle = { |
| 27 | + fn, |
| 28 | + invoker: function () { |
| 29 | + const fn = handle.fn |
| 30 | + if (Array.isArray(fn)) { |
| 31 | + for (let i = 0; i < fn.length; i++) { |
| 32 | + fn[i].apply(null, arguments) |
| 33 | + } |
| 34 | + } else { |
| 35 | + fn.apply(null, arguments) |
| 36 | + } |
| 37 | + } |
| 38 | + } |
| 39 | + return handle |
| 40 | +} |
| 41 | + |
5 | 42 | export function updateListeners ( |
6 | 43 | on: Object, |
7 | 44 | oldOn: Object, |
8 | 45 | add: Function, |
9 | 46 | remove: Function, |
10 | 47 | vm: Component |
11 | 48 | ) { |
12 | | - let name, cur, old, curIsArray, oldIsArray, fn, event, capture, once |
| 49 | + let name, cur, old, event |
13 | 50 | for (name in on) { |
14 | 51 | cur = on[name] |
15 | 52 | old = oldOn[name] |
16 | | - curIsArray = Array.isArray(cur) |
17 | | - oldIsArray = Array.isArray(old) |
| 53 | + event = normalizeEvent(name) |
18 | 54 | if (!cur) { |
19 | 55 | process.env.NODE_ENV !== 'production' && warn( |
20 | | - `Invalid handler for event "${name}": got ` + String(cur), |
| 56 | + `Invalid handler for event "${event.name}": got ` + String(cur), |
21 | 57 | vm |
22 | 58 | ) |
23 | 59 | } else if (!old) { |
24 | | - once = name.charAt(0) === '~' // Prefixed last, checked first |
25 | | - event = once ? name.slice(1) : name |
26 | | - capture = event.charAt(0) === '!' |
27 | | - event = capture ? event.slice(1) : event |
28 | | - if (curIsArray) { |
29 | | - add(event, (cur.invoker = arrInvoker(cur)), once, capture) |
30 | | - } else { |
31 | | - if (!cur.invoker) { |
32 | | - fn = cur |
33 | | - cur = on[name] = {} |
34 | | - cur.fn = fn |
35 | | - cur.invoker = fnInvoker(cur) |
36 | | - } |
37 | | - add(event, cur.invoker, once, capture) |
| 60 | + if (!cur.invoker) { |
| 61 | + cur = on[name] = createEventHandle(cur) |
38 | 62 | } |
| 63 | + add(event.name, cur.invoker, event.once, event.capture) |
39 | 64 | } else if (cur !== old) { |
40 | | - if (curIsArray || oldIsArray) { |
41 | | - if (!curIsArray) cur = [cur] |
42 | | - if (!oldIsArray) old = [old] |
43 | | - old.length = cur.length |
44 | | - for (let i = 0; i < old.length; i++) old[i] = cur[i] |
45 | | - on[name] = old |
46 | | - } else { |
47 | | - old.fn = cur |
48 | | - on[name] = old |
49 | | - } |
| 65 | + old.fn = cur |
| 66 | + on[name] = old |
50 | 67 | } |
51 | 68 | } |
52 | 69 | for (name in oldOn) { |
53 | 70 | if (!on[name]) { |
54 | | - once = name.charAt(0) === '~' // Prefixed last, checked first |
55 | | - event = once ? name.slice(1) : name |
56 | | - capture = event.charAt(0) === '!' |
57 | | - event = capture ? event.slice(1) : event |
58 | | - remove(event, oldOn[name].invoker, capture) |
59 | | - } |
60 | | - } |
61 | | -} |
62 | | - |
63 | | -function arrInvoker (arr: Array<Function>): Function { |
64 | | - return function (ev) { |
65 | | - const single = arguments.length === 1 |
66 | | - for (let i = 0; i < arr.length; i++) { |
67 | | - single ? arr[i](ev) : arr[i].apply(null, arguments) |
| 71 | + event = normalizeEvent(name) |
| 72 | + remove(event.name, oldOn[name].invoker, event.capture) |
68 | 73 | } |
69 | 74 | } |
70 | 75 | } |
71 | | - |
72 | | -function fnInvoker (o: { fn: Function }): Function { |
73 | | - return function (ev) { |
74 | | - const single = arguments.length === 1 |
75 | | - single ? o.fn(ev) : o.fn.apply(null, arguments) |
76 | | - } |
77 | | -} |
0 commit comments