import { component, Controller, emit, html } from '../../src/fudgel.js';
component(
'child-el',
{ prop: ['x'], template: 'Child' },
class ChildElController {
changeCount = 0;
onInit() {
emit(this, 'onInit', this);
}
onChange() {
this.changeCount += 1;
}
}
);
component(
'parent-el',
{
template: html`
Change Count: {{changes}}
`,
},
class ParentElController {
changes?: number;
child: HTMLElement;
controller: Controller;
hidden = false;
x = 'one';
getCount() {
console.log(this.controller);
this.changes = this.controller.changeCount;
}
childInit(event: CustomEvent) {
console.log('Child initialized', event.detail);
this.controller = event.detail;
}
reset() {
this.changes = null;
this.hidden = false;
this.x = 'one';
}
makeChange() {
this.changes = null;
this.x = 'two';
}
hide() {
this.changes = null;
// Remove the element, which removes event listeners and removes
// the controller
this.hidden = true;
this.x = 'test1';
}
remove() {
this.changes = null;
// Remove the element, which removes event listeners and removes
// the controller
const e = this.child;
e.remove();
(e as any).x = 'test2'
}
}
);
describe('Element removal', () => {
it('removes bindings when hidden', () => {
cy.mount('');
cy.get('#get-count').click();
cy.get('#changes').should('have.text', '1');
cy.get('#make-change').click();
cy.get('#get-count').click();
cy.get('#changes').should('have.text', '2');
cy.get('#test1').click();
cy.get('#get-count').click();
cy.get('#changes').should('have.text', '2');
});
it('removes bindings when removed', () => {
cy.mount('');
cy.get('#get-count').click();
cy.get('#changes').should('have.text', '1');
cy.get('#make-change').click();
cy.get('#get-count').click();
cy.get('#changes').should('have.text', '2');
cy.get('#test2').click();
cy.get('#get-count').click();
cy.get('#changes').should('have.text', '2');
});
});