Skip to content

Commit

Permalink
fix: avoid merging the invoker itself with its fns closes #2347 closes
Browse files Browse the repository at this point in the history
  • Loading branch information
logaretm committed Sep 18, 2019
1 parent 6dc9fad commit 07fa140
Showing 1 changed file with 19 additions and 10 deletions.
29 changes: 19 additions & 10 deletions src/utils/vnode.ts
Expand Up @@ -89,21 +89,30 @@ export function findModelConfig(vnode: VNode): { prop: string; event: string } |

// Adds a listener to vnode listener object.
export function mergeVNodeListeners(obj: any, eventName: string, handler: Function): void {
// Has a single listener.
if (isCallable(obj[eventName])) {
const prevHandler = obj[eventName];
obj[eventName] = [prevHandler];
// no listener at all.
if (isNullOrUndefined(obj[eventName])) {
obj[eventName] = [handler];
return;
}

// has other listeners.
if (Array.isArray(obj[eventName])) {
obj[eventName].push(handler);
// Is an invoker.
if (isCallable(obj[eventName]) && obj[eventName].fns) {
const invoker = obj[eventName];
invoker.fns = Array.isArray(invoker.fns) ? invoker.fns : [invoker.fns];
if (!includes(invoker.fns, handler)) {
invoker.fns.push(handler);
}

return;
}

// no listener at all.
if (isNullOrUndefined(obj[eventName])) {
obj[eventName] = [handler];
if (isCallable(obj[eventName])) {
const prev = obj[eventName];
obj[eventName] = [prev];
}

if (Array.isArray(obj[eventName]) && !includes(obj[eventName], handler)) {
obj[eventName].push(handler);
}
}

Expand Down

0 comments on commit 07fa140

Please sign in to comment.