|
1 |
| -import Modifier from 'ember-modifier'; |
2 |
| -import { inject as service } from '@ember/service'; |
3 | 1 | import { assert } from '@ember/debug';
|
| 2 | +import { registerDestructor } from '@ember/destroyable'; |
| 3 | +import { inject as service } from '@ember/service'; |
4 | 4 | import { tracked } from '@glimmer/tracking';
|
| 5 | +import Modifier from 'ember-modifier'; |
5 | 6 |
|
6 | 7 | const modifierName = 'on-event';
|
7 | 8 |
|
| 9 | +const cleanup = (instance) => { |
| 10 | + const { eventName, events } = instance; |
| 11 | + if (eventName) { |
| 12 | + events.off(eventName, instance, instance._handler); |
| 13 | + } |
| 14 | +}; |
| 15 | + |
8 | 16 | export default class OnEventModifier extends Modifier {
|
9 | 17 | @service events;
|
10 | 18 | @tracked eventName;
|
| 19 | + @tracked handler; |
11 | 20 |
|
12 |
| - get handler() { |
13 |
| - return this.args.positional[1]; |
14 |
| - } |
15 |
| - |
16 |
| - didReceiveArguments() { |
17 |
| - assert(`You must provide at least 2 arguments for {{${modifierName}}}`, this.args.positional.length > 1); |
18 |
| - let eventName = this.args.positional[0]; |
| 21 | + modify(element, positionalArgs) { |
| 22 | + assert(`You must provide at least 2 arguments for {{${modifierName}}}`, positionalArgs.length > 1); |
| 23 | + const [eventName, handler] = positionalArgs; |
19 | 24 | assert(
|
20 | 25 | `You must provide a string as the first positional argument for {{${modifierName}}}`,
|
21 | 26 | typeof eventName === 'string' && eventName.length > 0
|
22 | 27 | );
|
23 | 28 | this.eventName = eventName;
|
| 29 | + this.handler = handler; |
24 | 30 | this.events.on(this.eventName, this, this._handler);
|
25 |
| - } |
26 |
| - |
27 |
| - willRemove() { |
28 |
| - if (this.eventName) { |
29 |
| - this.events.off(this.eventName, this, this._handler); |
30 |
| - } |
| 31 | + registerDestructor(this, cleanup); |
31 | 32 | }
|
32 | 33 |
|
33 | 34 | _handler() {
|
|
0 commit comments