1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
| /* @flow */
|
| import {
| warn,
| invokeWithErrorHandling
| } from 'core/util/index'
| import {
| cached,
| isUndef,
| isTrue,
| isPlainObject
| } from 'shared/util'
|
| const normalizeEvent = cached((name: string): {
| name: string,
| once: boolean,
| capture: boolean,
| passive: boolean,
| handler?: Function,
| params?: Array<any>
| } => {
| const passive = name.charAt(0) === '&'
| name = passive ? name.slice(1) : name
| const once = name.charAt(0) === '~' // Prefixed last, checked first
| name = once ? name.slice(1) : name
| const capture = name.charAt(0) === '!'
| name = capture ? name.slice(1) : name
| return {
| name,
| once,
| capture,
| passive
| }
| })
|
| export function createFnInvoker (fns: Function | Array<Function>, vm: ?Component): Function {
| function invoker () {
| const fns = invoker.fns
| if (Array.isArray(fns)) {
| const cloned = fns.slice()
| for (let i = 0; i < cloned.length; i++) {
| invokeWithErrorHandling(cloned[i], null, arguments, vm, `v-on handler`)
| }
| } else {
| // return handler return value for single handlers
| return invokeWithErrorHandling(fns, null, arguments, vm, `v-on handler`)
| }
| }
| invoker.fns = fns
| return invoker
| }
|
| export function updateListeners (
| on: Object,
| oldOn: Object,
| add: Function,
| remove: Function,
| createOnceHandler: Function,
| vm: Component
| ) {
| let name, def, cur, old, event
| for (name in on) {
| def = cur = on[name]
| old = oldOn[name]
| event = normalizeEvent(name)
| /* istanbul ignore if */
| if (__WEEX__ && isPlainObject(def)) {
| cur = def.handler
| event.params = def.params
| }
| if (isUndef(cur)) {
| process.env.NODE_ENV !== 'production' && warn(
| `Invalid handler for event "${event.name}": got ` + String(cur),
| vm
| )
| } else if (isUndef(old)) {
| if (isUndef(cur.fns)) {
| cur = on[name] = createFnInvoker(cur, vm)
| }
| if (isTrue(event.once)) {
| cur = on[name] = createOnceHandler(event.name, cur, event.capture)
| }
| add(event.name, cur, event.capture, event.passive, event.params)
| } else if (cur !== old) {
| old.fns = cur
| on[name] = old
| }
| }
| for (name in oldOn) {
| if (isUndef(on[name])) {
| event = normalizeEvent(name)
| remove(event.name, oldOn[name], event.capture)
| }
| }
| }
|
|