MOBILE-3814 collapsible: Recalculate Height when slotted
parent
d727c53621
commit
dcb19c0f11
|
@ -72,6 +72,10 @@ export class CoreCollapsibleFooterDirective implements OnInit, OnDestroy {
|
||||||
|
|
||||||
await this.calculateHeight();
|
await this.calculateHeight();
|
||||||
|
|
||||||
|
CoreDomUtils.onElementSlot(this.element, () => {
|
||||||
|
this.calculateHeight();
|
||||||
|
});
|
||||||
|
|
||||||
this.listenScrollEvents();
|
this.listenScrollEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -220,6 +220,53 @@ export class CoreDomUtilsProvider {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Runs a function when an element has been slotted.
|
||||||
|
*
|
||||||
|
* @param element HTML Element inside an ion-content to wait for slot.
|
||||||
|
* @param callback Function to execute on resize.
|
||||||
|
*/
|
||||||
|
onElementSlot(element: HTMLElement, callback: (ev?: Event) => void): void {
|
||||||
|
if (!element.slot) {
|
||||||
|
// Element not declared to be slotted.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const slotName = element.slot;
|
||||||
|
if (element.assignedSlot?.name === slotName) {
|
||||||
|
// Slot already assigned.
|
||||||
|
callback();
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const content = element.closest('ion-content');
|
||||||
|
if (!content || !content.shadowRoot) {
|
||||||
|
// Cannot find content.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const slots = content.shadowRoot.querySelectorAll('slot');
|
||||||
|
const slot = Array.from(slots).find((slot) => slot.name === slotName);
|
||||||
|
|
||||||
|
if (!slot) {
|
||||||
|
// Slot not found.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const slotListener = () => {
|
||||||
|
if (element.assignedSlot?.name !== slotName) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
callback();
|
||||||
|
// It would happen only once.
|
||||||
|
slot.removeEventListener('slotchange', slotListener);
|
||||||
|
};
|
||||||
|
|
||||||
|
slot.addEventListener('slotchange', slotListener);;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Window resize is widely checked and may have many performance issues, debouce usage is needed to avoid calling it too much.
|
* Window resize is widely checked and may have many performance issues, debouce usage is needed to avoid calling it too much.
|
||||||
* This function helps setting up the debounce feature and remove listener easily.
|
* This function helps setting up the debounce feature and remove listener easily.
|
||||||
|
|
Loading…
Reference in New Issue