Skip to content

Commit 92d23ca

Browse files
committed
Fixing event args
1 parent d31f7af commit 92d23ca

File tree

4 files changed

+35
-7
lines changed

4 files changed

+35
-7
lines changed

src/LiveComponent/assets/dist/live_controller.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2943,8 +2943,6 @@ class LiveControllerDefault extends Controller {
29432943
throw new Error(`No event name provided on element: ${getElementAsTagText(event.currentTarget)}. Did you forget to add the "data-live-event-param" attribute?`);
29442944
}
29452945
const eventInfo = params.event;
2946-
const eventArgs = Object.assign({}, params);
2947-
delete eventArgs.event;
29482946
const directives = parseDirectives(eventInfo);
29492947
const emits = [];
29502948
directives.forEach((directive) => {
@@ -2960,7 +2958,7 @@ class LiveControllerDefault extends Controller {
29602958
});
29612959
emits.push({
29622960
name: directive.action,
2963-
data: eventArgs,
2961+
data: directive.named,
29642962
nameMatch,
29652963
});
29662964
});

src/LiveComponent/assets/src/live_controller.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,6 @@ export default class LiveControllerDefault extends Controller<HTMLElement> imple
256256
);
257257
}
258258
const eventInfo = params.event;
259-
// all other params are considered event arguments
260-
const eventArgs = { ...params };
261-
delete eventArgs.event;
262259

263260
// data-event="name(product_list)|some_event"
264261
const directives = parseDirectives(eventInfo);
@@ -277,7 +274,7 @@ export default class LiveControllerDefault extends Controller<HTMLElement> imple
277274

278275
emits.push({
279276
name: directive.action,
280-
data: eventArgs,
277+
data: directive.named,
281278
nameMatch,
282279
});
283280
});

src/LiveComponent/assets/test/controller/emit.test.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,28 @@ describe('LiveController Emit Tests', () => {
6464
// wait a tiny bit - enough for a request to be sent if it was going to be
6565
await new Promise((resolve) => setTimeout(resolve, 10));
6666
});
67+
68+
it('emits event with extra arguments', async () => {
69+
const test = await createTest({ renderCount: 0 }, (data: any) => `
70+
<div ${initComponent(data, {
71+
name: 'simple-component',
72+
listeners: [{ event: 'fooEvent', action: 'fooAction' }]
73+
})}>
74+
Render Count: ${data.renderCount}
75+
<button
76+
data-action="live#emit"
77+
data-live-event-param="fooEvent(arg=foo)"
78+
>Emit Simple</button>
79+
</div>
80+
`);
81+
82+
test.expectsAjaxCall()
83+
.expectActionCalled('fooAction', { arg: 'foo' })
84+
.serverWillChangeProps((data) => {
85+
data.renderCount = 1;
86+
})
87+
88+
getByText(test.element, 'Emit Simple').click();
89+
await waitFor(() => expect(test.element).toHaveTextContent('Render Count: 1'));
90+
});
6791
});

src/LiveComponent/doc/index.rst

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2557,6 +2557,15 @@ with an entity name, just like you would in a controller::
25572557
$this->lastProduct = $product;
25582558
}
25592559

2560+
You can also pass data to a listener when emitting from HTML:
2561+
2562+
.. code-block:: html
2563+
2564+
<button
2565+
data-action="live#emit"
2566+
data-live-event-param="productAdded(product=42)"
2567+
>
2568+
25602569
Scoping Events
25612570
~~~~~~~~~~~~~~
25622571

0 commit comments

Comments
 (0)