diff --git a/packages/core/src/zone/ng_zone.ts b/packages/core/src/zone/ng_zone.ts index a2fe01cb804..1fe5c47113e 100644 --- a/packages/core/src/zone/ng_zone.ts +++ b/packages/core/src/zone/ng_zone.ts @@ -419,6 +419,10 @@ function forkInnerZoneWithAngularBehavior(zone: NgZonePrivate) { onInvokeTask: (delegate: ZoneDelegate, current: Zone, target: Zone, task: Task, applyThis: any, applyArgs: any): any => { + if (shouldBeIgnoredByZone(applyArgs)) { + return delegate.invokeTask(target, task, applyThis, applyArgs); + } + try { onEnter(zone); return delegate.invokeTask(target, task, applyThis, applyArgs); @@ -585,3 +589,18 @@ export function isStableFactory() { }); return merge(isCurrentlyStable, isStable.pipe(share())); } + +function shouldBeIgnoredByZone(applyArgs: unknown): boolean { + if (!Array.isArray(applyArgs)) { + return false; + } + + // We should only ever get 1 arg passed through to invokeTask. + // Short circuit here incase that behavior changes. + if (applyArgs.length !== 1) { + return false; + } + + // Prevent triggering change detection when the __ignore_ng_zone__ flag is detected. + return applyArgs[0].data?.['__ignore_ng_zone__'] === true; +}