Skip to content

Commit b6fb688

Browse files
committed
feat: improve CD calls by rendering outside of ngZone
1 parent db5dfee commit b6fb688

File tree

1 file changed

+40
-8
lines changed

1 file changed

+40
-8
lines changed

packages/angular/src/lib/nativescript-renderer.ts

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,25 @@ const addStyleToCss = profile('"renderer".addStyleToCss', function addStyleToCss
1616
}
1717
});
1818

19+
function runInRootZone<T>(fn: () => T): T {
20+
if (typeof Zone === 'undefined') {
21+
return fn();
22+
}
23+
return Zone.root.run(fn);
24+
}
25+
26+
function inRootZone() {
27+
return function (target: Object, key: string | symbol, descriptor: PropertyDescriptor) {
28+
const childFunction = descriptor.value;
29+
descriptor.value = (...args: any[]) => {
30+
return runInRootZone(() => {
31+
childFunction.apply(this, args);
32+
});
33+
};
34+
return descriptor;
35+
};
36+
}
37+
1938
export class NativeScriptRendererFactory implements RendererFactory2 {
2039
private componentRenderers = new Map<string, Renderer2>();
2140
private defaultRenderer: Renderer2;
@@ -119,6 +138,7 @@ class NativeScriptRenderer implements Renderer2 {
119138
NativeScriptDebug.rendererLog('NativeScriptRenderer.destroy');
120139
}
121140
}
141+
@inRootZone()
122142
createElement(name: string, namespace?: string) {
123143
if (NativeScriptDebug.enabled) {
124144
NativeScriptDebug.rendererLog(`NativeScriptRenderer.createElement: ${name}`);
@@ -134,38 +154,44 @@ class NativeScriptRenderer implements Renderer2 {
134154
}
135155
return view;
136156
}
157+
@inRootZone()
137158
createComment(value: string) {
138159
if (NativeScriptDebug.enabled) {
139160
NativeScriptDebug.rendererLog(`NativeScriptRenderer.createComment ${value}`);
140161
}
141162
return this.viewUtil.createComment(value);
142163
}
164+
@inRootZone()
143165
createText(value: string) {
144166
if (NativeScriptDebug.enabled) {
145167
NativeScriptDebug.rendererLog(`NativeScriptRenderer.createText ${value}`);
146168
}
147169
return this.viewUtil.createText(value);
148170
}
149-
destroyNode: (node: any) => void = (node: View) => {
150-
if (NativeScriptDebug.enabled) {
151-
NativeScriptDebug.rendererLog(`NativeScriptRenderer.destroyNode node: ${node}`);
152-
}
153-
if (node?.destroyNode) {
154-
node?.destroyNode();
155-
}
156-
};
171+
destroyNode: (node: any) => void = (node: View) =>
172+
runInRootZone(() => {
173+
if (NativeScriptDebug.enabled) {
174+
NativeScriptDebug.rendererLog(`NativeScriptRenderer.destroyNode node: ${node}`);
175+
}
176+
if (node?.destroyNode) {
177+
node?.destroyNode();
178+
}
179+
});
180+
@inRootZone()
157181
appendChild(parent: View, newChild: View): void {
158182
if (NativeScriptDebug.enabled) {
159183
NativeScriptDebug.rendererLog(`NativeScriptRenderer.appendChild child: ${newChild} parent: ${parent}`);
160184
}
161185
this.viewUtil.appendChild(parent, newChild);
162186
}
187+
@inRootZone()
163188
insertBefore(parent: any, newChild: any, refChild: any): void {
164189
if (NativeScriptDebug.enabled) {
165190
NativeScriptDebug.rendererLog(`NativeScriptRenderer.insertBefore child: ${newChild} ` + `parent: ${parent} refChild: ${refChild}`);
166191
}
167192
this.viewUtil.insertBefore(parent, newChild, refChild);
168193
}
194+
@inRootZone()
169195
removeChild(parent: any, oldChild: any, isHostElement?: boolean): void {
170196
if (NativeScriptDebug.enabled) {
171197
NativeScriptDebug.rendererLog(`NativeScriptRenderer.removeChild child: ${oldChild} parent: ${parent}`);
@@ -205,6 +231,7 @@ class NativeScriptRenderer implements Renderer2 {
205231
}
206232
return node.nextSibling;
207233
}
234+
@inRootZone()
208235
setAttribute(el: any, name: string, value: string, namespace?: string): void {
209236
if (NativeScriptDebug.enabled) {
210237
NativeScriptDebug.rendererLog(`NativeScriptRenderer.setAttribute ${namespace ? namespace + ':' : ''}${el}.${name} = ${value}`);
@@ -216,30 +243,35 @@ class NativeScriptRenderer implements Renderer2 {
216243
NativeScriptDebug.rendererLog(`NativeScriptRenderer.removeAttribute ${namespace ? namespace + ':' : ''}${el}.${name}`);
217244
}
218245
}
246+
@inRootZone()
219247
addClass(el: any, name: string): void {
220248
if (NativeScriptDebug.enabled) {
221249
NativeScriptDebug.rendererLog(`NativeScriptRenderer.addClass ${name}`);
222250
}
223251
this.viewUtil.addClass(el, name);
224252
}
253+
@inRootZone()
225254
removeClass(el: any, name: string): void {
226255
if (NativeScriptDebug.enabled) {
227256
NativeScriptDebug.rendererLog(`NativeScriptRenderer.removeClass ${name}`);
228257
}
229258
this.viewUtil.removeClass(el, name);
230259
}
260+
@inRootZone()
231261
setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2): void {
232262
if (NativeScriptDebug.enabled) {
233263
NativeScriptDebug.rendererLog(`NativeScriptRenderer.setStyle: ${el}, ${style} = ${value}`);
234264
}
235265
this.viewUtil.setStyle(el, style, value);
236266
}
267+
@inRootZone()
237268
removeStyle(el: any, style: string, flags?: RendererStyleFlags2): void {
238269
if (NativeScriptDebug.enabled) {
239270
NativeScriptDebug.rendererLog('NativeScriptRenderer.removeStyle: ${styleName}');
240271
}
241272
this.viewUtil.removeStyle(el, style);
242273
}
274+
@inRootZone()
243275
setProperty(el: any, name: string, value: any): void {
244276
if (NativeScriptDebug.enabled) {
245277
NativeScriptDebug.rendererLog(`NativeScriptRenderer.setProperty ${el}.${name} = ${value}`);

0 commit comments

Comments
 (0)