Skip to content

Commit a4f9465

Browse files
Tom Hernitlouisse
authored andcommitted
fix(form): remove disconnected elements from Form Registrar Manager
1 parent 635b097 commit a4f9465

File tree

3 files changed

+30
-0
lines changed

3 files changed

+30
-0
lines changed

packages/field/src/FormRegistrarMixin.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,13 @@ export const FormRegistrarMixin = dedupeMixin(
3434
this.addEventListener('form-element-register', this._onRequestToAddFormElement);
3535
}
3636

37+
disconnectedCallback() {
38+
if (super.disconnectedCallback) {
39+
super.disconnectedCallback();
40+
}
41+
formRegistrarManager.remove(this);
42+
}
43+
3744
isRegisteredFormElement(el) {
3845
return this.formElementsArray.some(exitingEl => exitingEl === el);
3946
}

packages/field/src/formRegistrarManager.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ class FormRegistrarManager {
1616
this.ready = false;
1717
}
1818

19+
remove(registrar) {
20+
this.__elements.splice(this.__elements.indexOf(registrar));
21+
}
22+
1923
becomesReady() {
2024
if (this.__elements.every(el => el.__readyForRegistration === true)) {
2125
this.dispatchEvent(new Event('all-forms-open-for-registration'));

packages/field/test/FormRegistrationMixins.test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { expect, fixture, html, defineCE, unsafeStatic } from '@open-wc/testing'
22
import sinon from 'sinon';
33
import { LitElement, UpdatingElement } from '@lion/core';
44

5+
import { formRegistrarManager } from '../src/formRegistrarManager.js';
56
import { FormRegisteringMixin } from '../src/FormRegisteringMixin.js';
67
import { FormRegistrarMixin } from '../src/FormRegistrarMixin.js';
78

@@ -36,6 +37,24 @@ describe('FormRegistrationMixins', () => {
3637
expect(el.querySelector('form-registrar').formElements.length).to.equal(1);
3738
});
3839

40+
it('forgets disconnected registrars', async () => {
41+
const el = await fixture(html`
42+
<form-registrar>
43+
<form-registrar>
44+
<form-registering></form-registering>
45+
</form-registrar>
46+
<form-registrar id="remove">
47+
<form-registering></form-registering>
48+
</form-registrar>
49+
</form-registrar>
50+
`);
51+
await el.registrationReady;
52+
expect(formRegistrarManager.__elements.length).to.equal(3);
53+
54+
el.querySelector('#remove').remove();
55+
expect(formRegistrarManager.__elements.length).to.equal(2);
56+
});
57+
3958
it('works for component that have a delayed render', async () => {
4059
const tagWrapperString = defineCE(
4160
class extends FormRegistrarMixin(LitElement) {

0 commit comments

Comments
 (0)