Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

In Listener, old listener_controller event is still being triggered on target field change #2794

Open
nayminlwin opened this issue Jan 23, 2024 · 0 comments
Assignees
Labels

Comments

@nayminlwin
Copy link

Describe the bug
When using Listener with target field and then changing the target field more than once will trigger the old controller instance's asyncLoadData function. This causes the browser to throw an error FormData constructor: Argument 1 is not an object. since the controller's element is already detached.

To Reproduce
Steps to reproduce the behavior:

  1. Create a Screen with a single checkbox
  2. Create a Listener that targets the checkbox
  3. Check/uncheck the checkbox more than once

Expected behavior
No client side error occurred.

Desktop (please complete the following information):

  • OS: Windows 11
  • Browser Firefox
  • Version 121.0.1

Server (please complete the following information):

  • Platfrom Version: 14
  • Laravel Version: 10
  • PHP Version: 8.2
  • Database: MariaDB
  • Database Version: 10

Additional context
Seems like the problem's caused by stale event handler pointing to the asyncLoadData. I tried removing the event handler on disconnect to solve it through my own custom controller like follows.

    eventHandles = {};
    connect() {
        this.targets.forEach(name => {
            document.querySelectorAll(`[name="${name}"]`)
                .forEach((field) => {
                    this.eventHandles[field] = () => this.asyncLoadData();
                    field.addEventListener('change',  this.eventHandles[field])
                });
        });
    }
    disconnect() {
        this.targets.forEach(name => {
            document.querySelectorAll(`[name="${name}"]`)
                .forEach((field) =>
                    field.removeEventListener('change', this.eventHandles[field])
                );
        });
    }

Not sure if this is the preferred approach though. If so, I can submit a pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Development

No branches or pull requests

2 participants