Skip to content

Commit d2347b7

Browse files
committed
bug #1951 [Dropzone] Remove event listeners on disconnect (aleho)
This PR was merged into the 2.x branch. Discussion ---------- [Dropzone] Remove event listeners on disconnect | Q | A | ------------- | --- | Bug fix? | yes | New feature? | no | License | MIT Events added in controller connect were not removed on disconnect. This would lead to events being triggered twice if a dropzone input is, e.g., moved in the DOM. Commits ------- 0164705 [Dropzone] Remove event listeners on disconnect
2 parents bdb5bc3 + 0164705 commit d2347b7

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

src/Dropzone/assets/dist/controller.d.ts

+2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@ export default class extends Controller {
77
readonly previewFilenameTarget: HTMLDivElement;
88
readonly previewImageTarget: HTMLDivElement;
99
static targets: string[];
10+
initialize(): void;
1011
connect(): void;
12+
disconnect(): void;
1113
clear(): void;
1214
onInputChange(event: any): void;
1315
_populateImagePreview(file: Blob): void;

src/Dropzone/assets/dist/controller.js

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
import { Controller } from '@hotwired/stimulus';
22

33
class default_1 extends Controller {
4+
initialize() {
5+
this.clear = this.clear.bind(this);
6+
this.onInputChange = this.onInputChange.bind(this);
7+
}
48
connect() {
59
this.clear();
6-
this.previewClearButtonTarget.addEventListener('click', () => this.clear());
7-
this.inputTarget.addEventListener('change', (event) => this.onInputChange(event));
10+
this.previewClearButtonTarget.addEventListener('click', this.clear);
11+
this.inputTarget.addEventListener('change', this.onInputChange);
812
this.dispatchEvent('connect');
913
}
14+
disconnect() {
15+
this.previewClearButtonTarget.removeEventListener('click', this.clear);
16+
this.inputTarget.removeEventListener('change', this.onInputChange);
17+
}
1018
clear() {
1119
this.inputTarget.value = '';
1220
this.inputTarget.style.display = 'block';

src/Dropzone/assets/src/controller.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,29 @@ export default class extends Controller {
2121

2222
static targets = ['input', 'placeholder', 'preview', 'previewClearButton', 'previewFilename', 'previewImage'];
2323

24+
initialize() {
25+
this.clear = this.clear.bind(this);
26+
this.onInputChange = this.onInputChange.bind(this);
27+
}
28+
2429
connect() {
2530
// Reset when connecting to work with Turbolinks
2631
this.clear();
2732

2833
// Clear on click on clear button
29-
this.previewClearButtonTarget.addEventListener('click', () => this.clear());
34+
this.previewClearButtonTarget.addEventListener('click', this.clear);
3035

3136
// Listen on input change and display preview
32-
this.inputTarget.addEventListener('change', (event) => this.onInputChange(event));
37+
this.inputTarget.addEventListener('change', this.onInputChange);
3338

3439
this.dispatchEvent('connect');
3540
}
3641

42+
disconnect() {
43+
this.previewClearButtonTarget.removeEventListener('click', this.clear);
44+
this.inputTarget.removeEventListener('change', this.onInputChange);
45+
}
46+
3747
clear() {
3848
this.inputTarget.value = '';
3949
this.inputTarget.style.display = 'block';

0 commit comments

Comments
 (0)