Skip to content

Commit 99914e6

Browse files
Tom Zellmantzellman
Tom Zellman
authored andcommitted
chore: support handling multiple events with on-event modifier
1 parent d833d73 commit 99914e6

File tree

5 files changed

+42
-8
lines changed

5 files changed

+42
-8
lines changed

.npmignore

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
/.prettierignore
2323
/.prettierrc
2424
/.template-lintrc.js
25+
/.tool-versions
2526
/.watchmanconfig
2627
/bower.json
2728
/CONTRIBUTING.md

addon/modifiers/on-event.js

+11-8
Original file line numberDiff line numberDiff line change
@@ -7,27 +7,30 @@ import Modifier from 'ember-modifier';
77
const modifierName = 'on-event';
88

99
const cleanup = (instance) => {
10-
const { eventName, events } = instance;
11-
if (eventName) {
10+
const { eventNames, events } = instance;
11+
for (const eventName of eventNames ?? []) {
1212
events.off(eventName, instance, instance._handler);
1313
}
1414
};
1515

1616
export default class OnEventModifier extends Modifier {
1717
@service events;
18-
@tracked eventName;
18+
@tracked eventNames;
1919
@tracked handler;
2020

2121
modify(element, positionalArgs) {
2222
assert(`You must provide at least 2 arguments for {{${modifierName}}}`, positionalArgs.length > 1);
23-
const [eventName, handler] = positionalArgs;
23+
const [eventNameOrNames, handler] = positionalArgs;
24+
const eventNames = Array.isArray(eventNameOrNames) ? eventNameOrNames : [eventNameOrNames];
2425
assert(
25-
`You must provide a string as the first positional argument for {{${modifierName}}}`,
26-
typeof eventName === 'string' && eventName.length > 0
26+
`You must provide a string or array of strings as the first positional argument for {{${modifierName}}}`,
27+
eventNames.every((eventName) => typeof eventName === 'string' && eventName.length > 0)
2728
);
28-
this.eventName = eventName;
29+
this.eventNames = eventNames;
2930
this.handler = handler;
30-
this.events.on(this.eventName, this, this._handler);
31+
for (const eventName of this.eventNames) {
32+
this.events.on(eventName, this, this._handler);
33+
}
3134
registerDestructor(this, cleanup);
3235
}
3336

tests/dummy/app/controllers/index.js

+11
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,25 @@ import Controller from '@ember/controller';
22
import { action } from '@ember/object';
33
import { inject as service } from '@ember/service';
44
import { tracked } from '@glimmer/tracking';
5+
import { TrackedArray } from 'tracked-built-ins';
56

67
export default class IndexController extends Controller {
78
@service events;
89
@tracked hasClicked = false;
10+
handledEvents = new TrackedArray([]);
911

1012
@action
1113
resetValue() {
1214
this.hasClicked = false;
1315
this.events.trigger('valueReset');
1416
}
17+
18+
@action
19+
trackEvent(...args) {
20+
if (args.length) {
21+
this.handledEvents.push(`Set value to ${args[0]}`);
22+
} else {
23+
this.handledEvents.push(`Reset value`);
24+
}
25+
}
1526
}

tests/dummy/app/templates/index.hbs

+6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@
2121
</div>
2222
{{/if}}
2323
</div>
24+
<ul class="text-xs" {{on-event (array "valueSet" "valueReset") this.trackEvent}}>
25+
{{#each this.handledEvents as |event|}}
26+
<li>{{event}}</li>
27+
{{/each}}
28+
</ul>
2429
</div>
2530
</div>
31+
2632
</div>

tests/integration/modifiers/on-event-test.js

+13
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,17 @@ module('Integration | Modifier | on-event', function (hooks) {
2525
const service = this.owner.lookup('service:events');
2626
service.trigger('foo', 'link', 'zelda', 'ganon');
2727
});
28+
29+
test('handle multiple events', async function (assert) {
30+
assert.expect(4);
31+
this.set('handleEvent', (...args) => {
32+
assert.strictEqual(args.length, 3);
33+
assert.deepEqual(args, ['link', 'zelda', 'ganon']);
34+
});
35+
await render(hbs`<div {{on-event (array "foo" "bar") this.handleEvent}}></div>`);
36+
const service = this.owner.lookup('service:events');
37+
service.trigger('foo', 'link', 'zelda', 'ganon');
38+
service.trigger('bar', 'link', 'zelda', 'ganon');
39+
service.trigger('baz', 'link', 'zelda', 'ganon');
40+
});
2841
});

0 commit comments

Comments
 (0)