refactor(ivy): simplify signature of appendChild / removeChild (#27987)
Previously the appendChild / removeChild could take null as an argument for a child to be added / removed. This is difficult to understand since the mentioned methods are noop if a child is null. This commit clarifies the appendChild / removeChild signature to systematically require a child node to be added removed. It turns out that null could be passed only for a very specific i18n cases so now we guard a call to removeChild with an explicit check on the i18n side. PR Close #27987
This commit is contained in:
parent
cc5fb914bc
commit
b432eb1cae
@ -782,7 +782,10 @@ function readUpdateOpCodes(
|
|||||||
function removeNode(index: number, viewData: LView) {
|
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);
|
||||||
removeChild(removedPhTNode, removedPhRNode || null, viewData);
|
if (removedPhRNode) {
|
||||||
|
removeChild(removedPhTNode, removedPhRNode, viewData);
|
||||||
|
}
|
||||||
|
|
||||||
removedPhTNode.detached = true;
|
removedPhTNode.detached = true;
|
||||||
ngDevMode && ngDevMode.rendererRemoveNode++;
|
ngDevMode && ngDevMode.rendererRemoveNode++;
|
||||||
|
|
||||||
@ -790,7 +793,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) {
|
||||||
removeChild(removedPhTNode, lContainer[NATIVE] || null, viewData);
|
removeChild(removedPhTNode, lContainer[NATIVE], viewData);
|
||||||
}
|
}
|
||||||
lContainer[RENDER_PARENT] = null;
|
lContainer[RENDER_PARENT] = null;
|
||||||
}
|
}
|
||||||
|
@ -631,9 +631,8 @@ export function nativeNextSibling(renderer: Renderer3, node: RNode): RNode|null
|
|||||||
* @param currentView The current LView
|
* @param currentView The current LView
|
||||||
* @returns Whether or not the child was appended
|
* @returns Whether or not the child was appended
|
||||||
*/
|
*/
|
||||||
export function appendChild(
|
export function appendChild(childEl: RNode, childTNode: TNode, currentView: LView): boolean {
|
||||||
childEl: RNode | null = null, childTNode: TNode, currentView: LView): boolean {
|
if (canInsertNativeNode(childTNode, currentView)) {
|
||||||
if (childEl !== null && canInsertNativeNode(childTNode, currentView)) {
|
|
||||||
const renderer = currentView[RENDERER];
|
const renderer = currentView[RENDERER];
|
||||||
const renderParent = getRenderParent(childTNode, currentView) !;
|
const renderParent = getRenderParent(childTNode, currentView) !;
|
||||||
const parentTNode: TNode = childTNode.parent || currentView[HOST_NODE] !;
|
const parentTNode: TNode = childTNode.parent || currentView[HOST_NODE] !;
|
||||||
@ -690,9 +689,9 @@ export function getBeforeNodeForView(index: number, views: LView[], containerNat
|
|||||||
* @param currentView The current LView
|
* @param currentView The current LView
|
||||||
* @returns Whether or not the child was removed
|
* @returns Whether or not the child was removed
|
||||||
*/
|
*/
|
||||||
export function removeChild(childTNode: TNode, childEl: RNode | null, currentView: LView): boolean {
|
export function removeChild(childTNode: TNode, childEl: RNode, currentView: LView): boolean {
|
||||||
// We only remove the element if not in View or not projected.
|
// We only remove the element if not in View or not projected.
|
||||||
if (childEl !== null && canInsertNativeNode(childTNode, currentView)) {
|
if (canInsertNativeNode(childTNode, currentView)) {
|
||||||
const parentNative = getRenderParent(childTNode, currentView) !;
|
const parentNative = getRenderParent(childTNode, currentView) !;
|
||||||
nativeRemoveChild(currentView[RENDERER], parentNative, childEl);
|
nativeRemoveChild(currentView[RENDERER], parentNative, childEl);
|
||||||
return true;
|
return true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user