Skip to content

Commit 61d0921

Browse files
authored
fix(ssr): resize observe and animation player errors 17.2.x (#15098)
* fix(*): Fix resize observe and animation player errors when using Angular SSR. * chore(*): fix build. Change a check in resize observer creation * chore(*): Use never observable when on server * chore(*): add comments * chore(*): apply review comments
1 parent 25c5151 commit 61d0921

File tree

5 files changed

+41
-23
lines changed

5 files changed

+41
-23
lines changed

projects/igniteui-angular/src/lib/core/utils.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { CurrencyPipe, formatDate as _formatDate, isPlatformBrowser } from '@angular/common';
22
import { Inject, Injectable, PLATFORM_ID } from '@angular/core';
33
import { mergeWith } from 'lodash-es';
4-
import { Observable } from 'rxjs';
4+
import { NEVER, Observable } from 'rxjs';
55
import { setImmediate } from './setImmediate';
66
import { isDevMode } from '@angular/core';
77

@@ -439,14 +439,23 @@ export const HEADER_KEYS = new Set([...Array.from(NAVIGATION_KEYS), 'escape', 'e
439439
* Run the resizeObservable outside angular zone, because it patches the MutationObserver which causes an infinite loop.
440440
* Related issue: https://github.com/angular/angular/issues/31712
441441
*/
442-
export const resizeObservable = (target: HTMLElement): Observable<ResizeObserverEntry[]> => new Observable((observer) => {
443-
const instance = new (getResizeObserver())((entries: ResizeObserverEntry[]) => {
444-
observer.next(entries);
445-
});
446-
instance.observe(target);
447-
const unsubscribe = () => instance.disconnect();
448-
return unsubscribe;
449-
});
442+
export const resizeObservable = (target: HTMLElement): Observable<ResizeObserverEntry[]> => {
443+
const resizeObserver = getResizeObserver();
444+
// check whether we are on server env or client env
445+
if (resizeObserver) {
446+
return new Observable((observer) => {
447+
const instance = new resizeObserver((entries: ResizeObserverEntry[]) => {
448+
observer.next(entries);
449+
});
450+
instance.observe(target);
451+
const unsubscribe = () => instance.disconnect();
452+
return unsubscribe;
453+
});
454+
} else {
455+
// if on a server env return a empty observable that does not complete immediately
456+
return NEVER;
457+
}
458+
}
450459

451460
/**
452461
* @hidden

projects/igniteui-angular/src/lib/directives/for-of/for_of.directive.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -491,8 +491,10 @@ export class IgxForOfDirective<T, U extends T[] = T[]> extends IgxForOfToken<T,U
491491
public ngAfterViewInit(): void {
492492
if (this.igxForScrollOrientation === 'vertical') {
493493
this._zone.runOutsideAngular(() => {
494-
this.contentObserver = new (getResizeObserver())(() => this.contentResizeNotify.next());
495-
this.contentObserver.observe(this.dc.instance._viewContainer.element.nativeElement);
494+
if (this.platformUtil.isBrowser) {
495+
this.contentObserver = new (getResizeObserver())(() => this.contentResizeNotify.next());
496+
this.contentObserver.observe(this.dc.instance._viewContainer.element.nativeElement);
497+
}
496498
});
497499
}
498500
}

projects/igniteui-angular/src/lib/services/animation/angular-animation-player.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ export class IgxAngularAnimationPlayer implements AnimationPlayer {
2323
// To workaround this we are getting the positions from the inner player.
2424
// This is logged in Angular here - https://github.com/angular/angular/issues/18891
2525
// As soon as this is resolved we can remove this hack
26-
this._innerPlayer = innerRenderer.engine.players[innerRenderer.engine.players.length - 1];
26+
const rendererEngine = innerRenderer.engine || innerRenderer.delegate.engine;
27+
// A workaround because of Angular SSR is using some delegation.
28+
this._innerPlayer = rendererEngine.players[rendererEngine.players.length - 1];
2729
}
2830

2931
public init(): void {

projects/igniteui-angular/src/lib/tabs/tabs/tab-header.component.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,10 +103,12 @@ export class IgxTabHeaderComponent extends IgxTabHeaderDirective implements Afte
103103
/** @hidden @internal */
104104
public ngAfterViewInit(): void {
105105
this.ngZone.runOutsideAngular(() => {
106-
this._resizeObserver = new (getResizeObserver())(() => {
107-
this.tabs.realignSelectedIndicator();
108-
});
109-
this._resizeObserver.observe(this.nativeElement);
106+
if (this.platform.isBrowser) {
107+
this._resizeObserver = new (getResizeObserver())(() => {
108+
this.tabs.realignSelectedIndicator();
109+
});
110+
this._resizeObserver.observe(this.nativeElement);
111+
}
110112
});
111113
}
112114

projects/igniteui-angular/src/lib/tabs/tabs/tabs.component.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { AfterViewInit, ChangeDetectorRef, Component, ElementRef, HostBinding, Inject, Input, NgZone, OnDestroy, ViewChild } from '@angular/core';
2-
import { getResizeObserver, mkenum } from '../../core/utils';
2+
import { getResizeObserver, mkenum, PlatformUtil } from '../../core/utils';
33
import { IgxAngularAnimationService } from '../../services/animation/angular-animation-service';
44
import { AnimationService } from '../../services/animation/animation';
55
import { IgxDirectionality } from '../../services/direction/directionality';
@@ -129,6 +129,7 @@ export class IgxTabsComponent extends IgxTabsDirective implements AfterViewInit,
129129
@Inject(IgxAngularAnimationService) animationService: AnimationService,
130130
cdr: ChangeDetectorRef,
131131
private ngZone: NgZone,
132+
private platform: PlatformUtil,
132133
dir: IgxDirectionality) {
133134
super(animationService, cdr, dir);
134135
}
@@ -139,12 +140,14 @@ export class IgxTabsComponent extends IgxTabsDirective implements AfterViewInit,
139140
super.ngAfterViewInit();
140141

141142
this.ngZone.runOutsideAngular(() => {
142-
this._resizeObserver = new (getResizeObserver())(() => {
143-
this.updateScrollButtons();
144-
this.realignSelectedIndicator();
145-
});
146-
this._resizeObserver.observe(this.headerContainer.nativeElement);
147-
this._resizeObserver.observe(this.viewPort.nativeElement);
143+
if (this.platform.isBrowser) {
144+
this._resizeObserver = new (getResizeObserver())(() => {
145+
this.updateScrollButtons();
146+
this.realignSelectedIndicator();
147+
});
148+
this._resizeObserver.observe(this.headerContainer.nativeElement);
149+
this._resizeObserver.observe(this.viewPort.nativeElement);
150+
}
148151
});
149152
}
150153

0 commit comments

Comments
 (0)