diff --git a/src/generators/nodes/Component.ts b/src/generators/nodes/Component.ts
index cc82981928..a1861664eb 100644
--- a/src/generators/nodes/Component.ts
+++ b/src/generators/nodes/Component.ts
@@ -10,6 +10,7 @@ import mungeAttribute from './shared/mungeAttribute';
import Node from './shared/Node';
import Block from '../dom/Block';
import Attribute from './Attribute';
+import usesThisOrArguments from '../../validate/js/utils/usesThisOrArguments';
export default class Component extends Node {
type: 'Component';
@@ -494,8 +495,11 @@ function mungeEventHandler(generator: DomGenerator, node: Node, handler: Node, b
);
}
+ let usesState = false;
+
handler.expression.arguments.forEach((arg: Node) => {
const { contexts } = block.contextualise(arg, null, true);
+ if (contexts.has('state')) usesState = true;
contexts.forEach(context => {
allContexts.add(context);
@@ -503,11 +507,12 @@ function mungeEventHandler(generator: DomGenerator, node: Node, handler: Node, b
});
body = deindent`
+ ${usesState && `const state = #component.get();`}
[✂${handler.expression.start}-${handler.expression.end}✂];
`;
} else {
body = deindent`
- ${block.alias('component')}.fire('${handler.name}', event);
+ #component.fire('${handler.name}', event);
`;
}
diff --git a/test/runtime/samples/component-event-not-stale/Button.html b/test/runtime/samples/component-event-not-stale/Button.html
new file mode 100644
index 0000000000..f2decc7386
--- /dev/null
+++ b/test/runtime/samples/component-event-not-stale/Button.html
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/test/runtime/samples/component-event-not-stale/_config.js b/test/runtime/samples/component-event-not-stale/_config.js
new file mode 100644
index 0000000000..3d6dd936ea
--- /dev/null
+++ b/test/runtime/samples/component-event-not-stale/_config.js
@@ -0,0 +1,30 @@
+export default {
+ data: {
+ value: 1,
+ },
+
+ test(assert, component, target, window) {
+ const buttons = target.querySelectorAll('button');
+ const click = new window.MouseEvent('click');
+
+ const events = [];
+ component.on('value', event => {
+ events.push(event);
+ });
+
+ buttons[0].dispatchEvent(click);
+ buttons[1].dispatchEvent(click);
+
+ component.set({ value: 2 });
+
+ buttons[0].dispatchEvent(click);
+ buttons[1].dispatchEvent(click);
+
+ assert.deepEqual(events, [
+ { value: 1 },
+ { value: 1 },
+ { value: 2 },
+ { value: 2 }
+ ]);
+ },
+};
diff --git a/test/runtime/samples/component-event-not-stale/main.html b/test/runtime/samples/component-event-not-stale/main.html
new file mode 100644
index 0000000000..e244f596ad
--- /dev/null
+++ b/test/runtime/samples/component-event-not-stale/main.html
@@ -0,0 +1,20 @@
+
+
+
+
\ No newline at end of file