feat(ivy): support renderer.destroy and renderer.destroyNode hooks (#24049)
PR Close #24049
This commit is contained in:

committed by
Victor Berchet

parent
f6f44edcc0
commit
2e21690c66
@ -228,10 +228,10 @@ The goal is for the `@Component` (and friends) to be the compiler of template. S
|
||||
### View Encapsulation
|
||||
| Feature | Runtime | Spec | Compiler |
|
||||
| ----------------------------------- | ------- | -------- | -------- |
|
||||
| Render3.None | ✅ | ✅ | ✅ |
|
||||
| Render2.None | ✅ | ✅ | ✅ |
|
||||
| Render2.Emulated | ❌ | ❌ | ❌ |
|
||||
| Render2.Native | ❌ | ❌ | ❌ |
|
||||
| Renderer3.None | ✅ | ✅ | ✅ |
|
||||
| Renderer2.None | ✅ | ✅ | ✅ |
|
||||
| Renderer2.Emulated | ❌ | ❌ | ❌ |
|
||||
| Renderer2.Native | ❌ | ❌ | ❌ |
|
||||
|
||||
|
||||
|
||||
@ -254,3 +254,28 @@ The goal is for the `@Component` (and friends) to be the compiler of template. S
|
||||
| `checkNoChanges()` | n/a | n/a | ❌ | n/a | n/a | ✅ |
|
||||
| `reattach()` | n/a | n/a | ❌ | n/a | n/a | ✅ |
|
||||
| `nativeElement()` | n/a | n/a | n/a | n/a | ✅ | n/a |
|
||||
|
||||
### Renderer2
|
||||
| Method | Runtime |
|
||||
| ----------------------------------- | ------- |
|
||||
| `data()` | n/a |
|
||||
| `destroy()` | ✅ |
|
||||
| `createElement()` | ✅ |
|
||||
| `createComment()` | n/a |
|
||||
| `createText()` | ✅ |
|
||||
| `destroyNode()` | ✅ |
|
||||
| `appendChild()` | ✅ |
|
||||
| `insertBefore()` | ✅ |
|
||||
| `removeChild()` | ✅ |
|
||||
| `selectRootElement()` | ✅ |
|
||||
| `parentNode()` | ❌ |
|
||||
| `nextSibling()` | ❌ |
|
||||
| `setAttribute()` | ✅ |
|
||||
| `removeAttribute()` | ✅ |
|
||||
| `addClass()` | ✅ |
|
||||
| `removeClass()` | ✅ |
|
||||
| `setStyle()` | ✅ |
|
||||
| `removeStyle()` | ✅ |
|
||||
| `setProperty()` | ✅ |
|
||||
| `setValue()` | ✅ |
|
||||
| `listen()` | ✅ |
|
@ -25,6 +25,8 @@ declare global {
|
||||
rendererRemoveClass: number;
|
||||
rendererSetStyle: number;
|
||||
rendererRemoveStyle: number;
|
||||
rendererDestroy: number;
|
||||
rendererDestroyNode: number;
|
||||
}
|
||||
}
|
||||
|
||||
@ -50,6 +52,8 @@ export const ngDevModeResetPerfCounters: () => void =
|
||||
rendererRemoveClass: 0,
|
||||
rendererSetStyle: 0,
|
||||
rendererRemoveStyle: 0,
|
||||
rendererDestroy: 0,
|
||||
rendererDestroyNode: 0,
|
||||
};
|
||||
}
|
||||
ngDevModeResetPerfCounters();
|
||||
|
@ -9,7 +9,7 @@
|
||||
import {assertNotNull} from './assert';
|
||||
import {callHooks} from './hooks';
|
||||
import {LContainer, unusedValueExportToPlacateAjd as unused1} from './interfaces/container';
|
||||
import {LContainerNode, LElementNode, LNode, LProjectionNode, LTextNode, LViewNode, TNodeType, unusedValueExportToPlacateAjd as unused2} from './interfaces/node';
|
||||
import {LContainerNode, LElementNode, LNode, LProjectionNode, LTextNode, LViewNode, TNodeFlags, TNodeType, unusedValueExportToPlacateAjd as unused2} from './interfaces/node';
|
||||
import {unusedValueExportToPlacateAjd as unused3} from './interfaces/projection';
|
||||
import {ProceduralRenderer3, RElement, RNode, RText, Renderer3, isProceduralRenderer, unusedValueExportToPlacateAjd as unused4} from './interfaces/renderer';
|
||||
import {HookData, LView, LViewOrLContainer, TView, unusedValueExportToPlacateAjd as unused5} from './interfaces/view';
|
||||
@ -215,8 +215,15 @@ export function addRemoveViewFromContainer(
|
||||
renderer.insertBefore(parent, node.native !, beforeNode as RNode | null) :
|
||||
parent.insertBefore(node.native !, beforeNode as RNode | null, true);
|
||||
} else {
|
||||
isProceduralRenderer(renderer) ? renderer.removeChild(parent as RElement, node.native !) :
|
||||
parent.removeChild(node.native !);
|
||||
if (isProceduralRenderer(renderer)) {
|
||||
renderer.removeChild(parent as RElement, node.native !);
|
||||
if (renderer.destroyNode) {
|
||||
ngDevMode && ngDevMode.rendererDestroyNode++;
|
||||
renderer.destroyNode(node.native !);
|
||||
}
|
||||
} else {
|
||||
parent.removeChild(node.native !);
|
||||
}
|
||||
}
|
||||
nextNode = getNextLNode(node);
|
||||
} else if (node.tNode.type === TNodeType.Container) {
|
||||
@ -398,6 +405,11 @@ function cleanUpView(view: LView): void {
|
||||
removeListeners(view);
|
||||
executeOnDestroys(view);
|
||||
executePipeOnDestroys(view);
|
||||
// For component views only, the local renderer is destroyed as clean up time.
|
||||
if (view.id === -1 && isProceduralRenderer(view.renderer)) {
|
||||
ngDevMode && ngDevMode.rendererDestroy++;
|
||||
view.renderer.destroy();
|
||||
}
|
||||
}
|
||||
|
||||
/** Removes listeners and unsubscribes from output subscriptions */
|
||||
|
Reference in New Issue
Block a user