feat(ivy): support renderer.destroy and renderer.destroyNode hooks (#24049)

PR Close #24049
This commit is contained in:
Marc Laval
2018-05-22 17:40:59 +02:00
committed by Victor Berchet
parent f6f44edcc0
commit 2e21690c66
5 changed files with 162 additions and 12 deletions

View File

@ -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()` | ✅ |

View File

@ -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();

View File

@ -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 */