refactor(ivy): move around logic of getting render parent (#28455)
PR Close #28455
This commit is contained in:
parent
89eac702b5
commit
7c5c1fae62
@ -10,6 +10,7 @@ import {SRCSET_ATTRS, URI_ATTRS, VALID_ATTRS, VALID_ELEMENTS, getTemplateContent
|
|||||||
import {InertBodyHelper} from '../sanitization/inert_body';
|
import {InertBodyHelper} from '../sanitization/inert_body';
|
||||||
import {_sanitizeUrl, sanitizeSrcset} from '../sanitization/url_sanitizer';
|
import {_sanitizeUrl, sanitizeSrcset} from '../sanitization/url_sanitizer';
|
||||||
import {assertDefined, assertEqual, assertGreaterThan} from '../util/assert';
|
import {assertDefined, assertEqual, assertGreaterThan} from '../util/assert';
|
||||||
|
|
||||||
import {attachPatchData} from './context_discovery';
|
import {attachPatchData} from './context_discovery';
|
||||||
import {allocExpando, createNodeAtIndex, elementAttribute, load, textBinding} from './instructions';
|
import {allocExpando, createNodeAtIndex, elementAttribute, load, textBinding} from './instructions';
|
||||||
import {LContainer, NATIVE} from './interfaces/container';
|
import {LContainer, NATIVE} from './interfaces/container';
|
||||||
@ -19,7 +20,7 @@ import {RComment, RElement} from './interfaces/renderer';
|
|||||||
import {SanitizerFn} from './interfaces/sanitization';
|
import {SanitizerFn} from './interfaces/sanitization';
|
||||||
import {StylingContext} from './interfaces/styling';
|
import {StylingContext} from './interfaces/styling';
|
||||||
import {BINDING_INDEX, HEADER_OFFSET, HOST_NODE, LView, RENDERER, TVIEW, TView} from './interfaces/view';
|
import {BINDING_INDEX, HEADER_OFFSET, HOST_NODE, LView, RENDERER, TVIEW, TView} from './interfaces/view';
|
||||||
import {appendChild, createTextNode, removeNode as removeRNode} from './node_manipulation';
|
import {appendChild, createTextNode, nativeRemoveNode} from './node_manipulation';
|
||||||
import {getIsParent, getLView, getPreviousOrParentTNode, setIsParent, setPreviousOrParentTNode} from './state';
|
import {getIsParent, getLView, getPreviousOrParentTNode, setIsParent, setPreviousOrParentTNode} from './state';
|
||||||
import {NO_CHANGE} from './tokens';
|
import {NO_CHANGE} from './tokens';
|
||||||
import {addAllToArray, getNativeByIndex, getNativeByTNode, getTNode, isLContainer, renderStringify} from './util';
|
import {addAllToArray, getNativeByIndex, getNativeByTNode, getTNode, isLContainer, renderStringify} from './util';
|
||||||
@ -830,7 +831,7 @@ function removeNode(index: number, viewData: LView) {
|
|||||||
const removedPhTNode = getTNode(index, viewData);
|
const removedPhTNode = getTNode(index, viewData);
|
||||||
const removedPhRNode = getNativeByIndex(index, viewData);
|
const removedPhRNode = getNativeByIndex(index, viewData);
|
||||||
if (removedPhRNode) {
|
if (removedPhRNode) {
|
||||||
removeRNode(removedPhTNode, removedPhRNode, viewData);
|
nativeRemoveNode(viewData[RENDERER], removedPhRNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
removedPhTNode.detached = true;
|
removedPhTNode.detached = true;
|
||||||
@ -840,7 +841,7 @@ function removeNode(index: number, viewData: LView) {
|
|||||||
if (isLContainer(slotValue)) {
|
if (isLContainer(slotValue)) {
|
||||||
const lContainer = slotValue as LContainer;
|
const lContainer = slotValue as LContainer;
|
||||||
if (removedPhTNode.type !== TNodeType.Container) {
|
if (removedPhTNode.type !== TNodeType.Container) {
|
||||||
removeRNode(removedPhTNode, lContainer[NATIVE], viewData);
|
nativeRemoveNode(viewData[RENDERER], lContainer[NATIVE]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -11,7 +11,7 @@ import {attachPatchData} from './context_discovery';
|
|||||||
import {callHooks} from './hooks';
|
import {callHooks} from './hooks';
|
||||||
import {LContainer, NATIVE, VIEWS, unusedValueExportToPlacateAjd as unused1} from './interfaces/container';
|
import {LContainer, NATIVE, VIEWS, unusedValueExportToPlacateAjd as unused1} from './interfaces/container';
|
||||||
import {ComponentDef} from './interfaces/definition';
|
import {ComponentDef} from './interfaces/definition';
|
||||||
import {TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeFlags, TNodeType, TProjectionNode, TViewNode, unusedValueExportToPlacateAjd as unused2} from './interfaces/node';
|
import {TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeFlags, TNodeType, TViewNode, unusedValueExportToPlacateAjd as unused2} from './interfaces/node';
|
||||||
import {unusedValueExportToPlacateAjd as unused3} from './interfaces/projection';
|
import {unusedValueExportToPlacateAjd as unused3} from './interfaces/projection';
|
||||||
import {ProceduralRenderer3, RComment, RElement, RNode, RText, Renderer3, isProceduralRenderer, unusedValueExportToPlacateAjd as unused4} from './interfaces/renderer';
|
import {ProceduralRenderer3, RComment, RElement, RNode, RText, Renderer3, isProceduralRenderer, unusedValueExportToPlacateAjd as unused4} from './interfaces/renderer';
|
||||||
import {CLEANUP, CONTAINER_INDEX, FLAGS, HEADER_OFFSET, HOST_NODE, HookData, LView, LViewFlags, NEXT, PARENT, QUERIES, RENDERER, TVIEW, unusedValueExportToPlacateAjd as unused5} from './interfaces/view';
|
import {CLEANUP, CONTAINER_INDEX, FLAGS, HEADER_OFFSET, HOST_NODE, HookData, LView, LViewFlags, NEXT, PARENT, QUERIES, RENDERER, TVIEW, unusedValueExportToPlacateAjd as unused5} from './interfaces/view';
|
||||||
@ -181,7 +181,7 @@ function executeNodeAction(
|
|||||||
if (action === WalkTNodeTreeAction.Insert) {
|
if (action === WalkTNodeTreeAction.Insert) {
|
||||||
nativeInsertBefore(renderer, parent !, node, beforeNode || null);
|
nativeInsertBefore(renderer, parent !, node, beforeNode || null);
|
||||||
} else if (action === WalkTNodeTreeAction.Detach) {
|
} else if (action === WalkTNodeTreeAction.Detach) {
|
||||||
nativeRemoveChild(renderer, node, isComponent(tNode));
|
nativeRemoveNode(renderer, node, isComponent(tNode));
|
||||||
} else if (action === WalkTNodeTreeAction.Destroy) {
|
} else if (action === WalkTNodeTreeAction.Destroy) {
|
||||||
ngDevMode && ngDevMode.rendererDestroyNode++;
|
ngDevMode && ngDevMode.rendererDestroyNode++;
|
||||||
(renderer as ProceduralRenderer3).destroyNode !(node);
|
(renderer as ProceduralRenderer3).destroyNode !(node);
|
||||||
@ -593,18 +593,13 @@ function nativeAppendOrInsertBefore(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Removes a node from the DOM. */
|
/** Removes a node from the DOM given its native parent. */
|
||||||
export function nativeRemoveChild(
|
function nativeRemoveChild(
|
||||||
renderer: Renderer3, child: RNode, isHostElement?: boolean): void {
|
renderer: Renderer3, parent: RElement, child: RNode, isHostElement?: boolean): void {
|
||||||
if (isProceduralRenderer(renderer)) {
|
if (isProceduralRenderer(renderer)) {
|
||||||
const renderParent = renderer.parentNode(child);
|
renderer.removeChild(parent, child, isHostElement);
|
||||||
if (renderParent) {
|
|
||||||
renderer.removeChild(renderParent, child, isHostElement);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// We intentionally don't use the given parent node since it may no longer
|
parent.removeChild(child);
|
||||||
// match the state of the DOM (if the child node has been manually moved).
|
|
||||||
child.parentNode && child.parentNode.removeChild(child);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -693,14 +688,19 @@ export function getBeforeNodeForView(index: number, views: LView[], containerNat
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the `child` element from the DOM if not in view and not projected.
|
* Removes a native node itself using a given renderer. To remove the node we are looking up its
|
||||||
|
* parent from the native tree as not all platforms / browsers support the equivalent of
|
||||||
|
* node.remove().
|
||||||
*
|
*
|
||||||
* @param childTNode The TNode of the child to remove
|
* @param renderer A renderer to be used
|
||||||
* @param childEl The child that should be removed
|
* @param rNode The native node that should be removed
|
||||||
* @param currentView The current LView
|
* @param isHostElement A flag indicating if a node to be removed is a host of a component.
|
||||||
*/
|
*/
|
||||||
export function removeNode(childTNode: TNode, childEl: RNode, currentView: LView): void {
|
export function nativeRemoveNode(renderer: Renderer3, rNode: RNode, isHostElement?: boolean): void {
|
||||||
nativeRemoveChild(currentView[RENDERER], childEl);
|
const nativeParent = nativeParentNode(renderer, rNode);
|
||||||
|
if (nativeParent) {
|
||||||
|
nativeRemoveChild(renderer, nativeParent, rNode, isHostElement);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1022,6 +1022,9 @@
|
|||||||
{
|
{
|
||||||
"name": "nativeRemoveChild"
|
"name": "nativeRemoveChild"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "nativeRemoveNode"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "nextContext"
|
"name": "nextContext"
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user