diff --git a/packages/vchart/__tests__/unit/interaction/base-trigger.test.ts b/packages/vchart/__tests__/unit/interaction/base-trigger.test.ts new file mode 100644 index 0000000000..5cc102561b --- /dev/null +++ b/packages/vchart/__tests__/unit/interaction/base-trigger.test.ts @@ -0,0 +1,34 @@ +import { BaseTrigger } from '../../../src/interaction/triggers/base'; +import type { IBaseTriggerOptions, ITriggerEventHandler } from '../../../src/interaction/interface/trigger'; + +class TestTrigger extends BaseTrigger { + type = 'test'; + readonly handler = jest.fn(); + + protected getEvents(): Array<{ type: string | string[]; handler: ITriggerEventHandler }> { + return [{ type: ['pointerdown', 'none', 'pointermove'], handler: this.handler }]; + } +} + +describe('BaseTrigger', () => { + it('unbinds every event in an array-valued trigger when released', () => { + const event = { + on: jest.fn(), + off: jest.fn(), + emit: jest.fn() + }; + const trigger = new TestTrigger({ event, interaction: {} as IBaseTriggerOptions['interaction'] }); + + trigger.init(); + trigger.release(); + + expect(event.on.mock.calls).toEqual([ + ['pointerdown', trigger.handler], + ['pointermove', trigger.handler] + ]); + expect(event.off.mock.calls).toEqual([ + ['pointerdown', trigger.handler], + ['pointermove', trigger.handler] + ]); + }); +}); diff --git a/packages/vchart/src/interaction/triggers/base.ts b/packages/vchart/src/interaction/triggers/base.ts index a80c390809..a9b2bbe9a3 100644 --- a/packages/vchart/src/interaction/triggers/base.ts +++ b/packages/vchart/src/interaction/triggers/base.ts @@ -102,7 +102,7 @@ export abstract class BaseTrigger implements ITri if (evt.type && evt.handler) { if (isArray(evt.type)) { evt.type.forEach(evtType => { - evtType && evtType !== 'none' && this.options.event.on(evtType, evt.handler); + evtType && evtType !== 'none' && this.options.event.off(evtType, evt.handler); }); } else { evt.type !== 'none' && this.options.event.off(evt.type, evt.handler);