File

src/utils/animation-frame.service.ts

Index

Properties
Methods

Constructor

constructor(ngZone: NgZone)
Parameters :
Name Type Optional
ngZone NgZone No

Methods

Protected doTick
doTick(frame: number)
Parameters :
Name Type Optional
frame number No
Returns : void
ngOnDestroy
ngOnDestroy()
Returns : void

Properties

Protected animationFrameId
animationFrameId: number
Type : number
Protected frameSource
frameSource:
Default value : new Subject<number>()
Public tick
tick: Observable<number>
Type : Observable<number>
import {
	Injectable,
	OnDestroy,
	NgZone,
	Optional,
	SkipSelf
} from "@angular/core";
import { Observable, Subject, from } from "rxjs";

@Injectable()
export class AnimationFrameServiceSingleton implements OnDestroy {
	public tick: Observable<number>;

	protected frameSource = new Subject<number>();

	protected animationFrameId: number;

	constructor(protected ngZone: NgZone) {
		this.tick = this.frameSource.asObservable();
		this.ngZone.runOutsideAngular(() => {
			this.animationFrameId = requestAnimationFrame(this.doTick.bind(this));
		});
	}

	ngOnDestroy() {
		cancelAnimationFrame(this.animationFrameId);
	}

	protected doTick(frame: number) {
		this.frameSource.next(frame);
		this.ngZone.runOutsideAngular(() => {
			requestAnimationFrame(this.doTick.bind(this));
		});
	}
}

@Injectable()
export class AnimationFrameService {
	public tick: Observable<number>;

	constructor(protected singleton: AnimationFrameServiceSingleton) {
		this.tick = from(this.singleton.tick);
	}
}

// TODO: use `providedIn` instead of the provider factory pattern
// either provides a new instance of AnimationFrameServiceSingleton, or returns the parent
export function ANIMATION_FRAME_SERVICE_SINGLETON_PROVIDER_FACTORY(parentService: AnimationFrameServiceSingleton, ngZone: NgZone) {
	return parentService || new AnimationFrameServiceSingleton(ngZone);
}

export const ANIMATION_FRAME_SERVICE_SINGLETON_PROVIDER = {
	provide: AnimationFrameServiceSingleton,
	deps: [[new Optional(), new SkipSelf(), AnimationFrameServiceSingleton], NgZone],
	useFactory: ANIMATION_FRAME_SERVICE_SINGLETON_PROVIDER_FACTORY
};

result-matching ""

    No results matching ""