mirror of
https://github.com/ionic-team/ionic-framework.git
synced 2025-11-10 00:27:41 +08:00
fix(overlays): page is removed properly
This commit is contained in:
@ -40,7 +40,7 @@ function removeClone(componentEl: HTMLElement, inputEl: HTMLElement) {
|
||||
if (componentEl && componentEl.parentElement) {
|
||||
const clonedInputEles = componentEl.parentElement.querySelectorAll('.cloned-input');
|
||||
for (let i = 0; i < clonedInputEles.length; i++) {
|
||||
clonedInputEles[i].parentNode.removeChild(clonedInputEles[i]);
|
||||
clonedInputEles[i].remove();
|
||||
}
|
||||
componentEl.style.pointerEvents = '';
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@ import { Component, Element, Event, EventEmitter, Listen, Method, Prop } from '@
|
||||
import { Animation, AnimationBuilder, Config, FrameworkDelegate } from '../../index';
|
||||
|
||||
import { createThemedClasses, getClassMap } from '../../utils/theme';
|
||||
import { BACKDROP, OverlayEventDetail, OverlayInterface, attachComponent, dismiss, eventMethod, present } from '../../utils/overlays';
|
||||
import { BACKDROP, OverlayEventDetail, OverlayInterface, attachComponent, detachComponent, dismiss, eventMethod, present } from '../../utils/overlays';
|
||||
|
||||
import iosEnterAnimation from './animations/ios.enter';
|
||||
import iosLeaveAnimation from './animations/ios.leave';
|
||||
@ -186,7 +186,8 @@ export class Modal implements OverlayInterface {
|
||||
*/
|
||||
@Method()
|
||||
dismiss(data?: any, role?: string): Promise<void> {
|
||||
return dismiss(this, data, role, 'modalLeave', iosLeaveAnimation, mdLeaveAnimation);
|
||||
return dismiss(this, data, role, 'modalLeave', iosLeaveAnimation, mdLeaveAnimation)
|
||||
.then(() => detachComponent(this.delegate, this.usersElement));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -2,7 +2,7 @@ import { Component, Element, Event, EventEmitter, Listen, Method, Prop } from '@
|
||||
import { Animation, AnimationBuilder, Config, FrameworkDelegate } from '../../index';
|
||||
|
||||
import { createThemedClasses, getClassMap } from '../../utils/theme';
|
||||
import { BACKDROP, OverlayEventDetail, OverlayInterface, attachComponent, dismiss, eventMethod, present } from '../../utils/overlays';
|
||||
import { BACKDROP, OverlayEventDetail, OverlayInterface, attachComponent, detachComponent, dismiss, eventMethod, present } from '../../utils/overlays';
|
||||
|
||||
import iosEnterAnimation from './animations/ios.enter';
|
||||
import iosLeaveAnimation from './animations/ios.leave';
|
||||
@ -196,7 +196,8 @@ export class Popover implements OverlayInterface {
|
||||
*/
|
||||
@Method()
|
||||
dismiss(data?: any, role?: string): Promise<void> {
|
||||
return dismiss(this, data, role, 'popoverLeave', iosLeaveAnimation, mdLeaveAnimation, this.ev);
|
||||
return dismiss(this, data, role, 'popoverLeave', iosLeaveAnimation, mdLeaveAnimation, this.ev)
|
||||
.then(() => detachComponent(this.delegate, this.usersElement));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -82,7 +82,7 @@ export class RippleEffect {
|
||||
style.animationDuration = duration + 'ms';
|
||||
|
||||
this.el.appendChild(div);
|
||||
setTimeout(() => this.el.removeChild(div), duration + 50);
|
||||
setTimeout(() => div.remove(), duration + 50);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -98,9 +98,7 @@ export function dismiss(
|
||||
|
||||
return overlayAnimation(overlay, animationBuilder, overlay.el, opts).then(() => {
|
||||
overlay.didDismiss.emit({data, role});
|
||||
if (overlay.el.parentNode) {
|
||||
overlay.el.parentNode.removeChild(overlay.el);
|
||||
}
|
||||
overlay.el.remove();
|
||||
});
|
||||
}
|
||||
|
||||
@ -154,6 +152,17 @@ export function attachComponent(delegate: FrameworkDelegate, container: Element,
|
||||
return Promise.resolve(el);
|
||||
}
|
||||
|
||||
export function detachComponent(delegate: FrameworkDelegate, element: HTMLElement) {
|
||||
if (element) {
|
||||
if (delegate) {
|
||||
const container = element.parentElement;
|
||||
return delegate.removeViewFromDom(container, element);
|
||||
}
|
||||
element.remove();
|
||||
}
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
export function eventMethod<T>(element: HTMLElement, eventName: string, callback?: (detail: T) => void): Promise<T> {
|
||||
let resolve: Function;
|
||||
const promise = new Promise<T>(r => resolve = r);
|
||||
|
||||
Reference in New Issue
Block a user