Since my goal was to be able to abstract the window-size threads in another module, apparently just wrapping the threads in the class, sealed the deal:
This is the future version:
import {Observable, BehaviorSubject} from 'rxjs'; export class WindowSize { width$: Observable<number>; height$: Observable<number>; constructor() { let windowSize$ = createWindowSize$(); this.width$ = (windowSize$.pluck('width') as Observable<number>).distinctUntilChanged(); this.height$ = (windowSize$.pluck('height') as Observable<number>).distinctUntilChanged(); } } const createWindowSize$ = () => Observable.fromEvent(window, 'resize') .map(getWindowSize) .startWith(getWindowSize()) .publishReplay(1) .refCount(); const getWindowSize = () => { return { height: window.innerHeight, width: window.innerWidth } };
"Grandma" version:
import {Observable, BehaviorSubject} from 'rxjs'; export class WindowSize { width$: Observable<number>; height$: Observable<number>; constructor() { let windowSize$ = new BehaviorSubject(getWindowSize()); this.width$ = (windowSize$.pluck('width') as Observable<number>).distinctUntilChanged(); this.height$ = (windowSize$.pluck('height') as Observable<number>).distinctUntilChanged(); Observable.fromEvent(window, 'resize') .map(getWindowSize) .subscribe(windowSize$); } } function getWindowSize() { return { height: window.innerHeight, width: window.innerWidth }; }
Although I did not need a class / service in this module, just clear / platform-independent designs, it was the only clean way that worked for angular without worrying about starting zone updates.
Birowsky Feb 20 '16 at 13:50 2016-02-20 13:50
source share