Detecting real time window size changes in Angular 4

后端 未结 9 698
孤独总比滥情好
孤独总比滥情好 2020-12-04 05:44

I have been trying to build a responsive nav-bar and do not wish to use a media query, so I intend to use *ngIF with the window size as a criterion. But I have

相关标签:
9条回答
  • 2020-12-04 06:48

    The documentation for Platform width() and height(), it's stated that these methods use window.innerWidth and window.innerHeight respectively. But using the methods are preferred since the dimensions are cached values, which reduces the chance of multiple and expensive DOM reads.

    import { Platform } from 'ionic-angular';
    
    ...
    private width:number;
    private height:number;
    
    constructor(private platform: Platform){
        platform.ready().then(() => {
            this.width = platform.width();
            this.height = platform.height();
        });
    }
    
    0 讨论(0)
  • 2020-12-04 06:48

    This is an example of service which I use.

    You can get the screen width by subscribing to screenWidth$, or via screenWidth$.value.

    The same is for mediaBreakpoint$ ( or mediaBreakpoint$.value)

    import {
      Injectable,
      OnDestroy,
    } from '@angular/core';
    import {
      Subject,
      BehaviorSubject,
      fromEvent,
    } from 'rxjs';
    import {
      takeUntil,
      debounceTime,
    } from 'rxjs/operators';
    
    @Injectable()
    export class ResponsiveService implements OnDestroy {
      private _unsubscriber$: Subject<any> = new Subject();
      public screenWidth$: BehaviorSubject<number> = new BehaviorSubject(null);
      public mediaBreakpoint$: BehaviorSubject<string> = new BehaviorSubject(null);
    
      constructor() {}
    
      init() {
        this._setScreenWidth(window.innerWidth);
        this._setMediaBreakpoint(window.innerWidth);
        fromEvent(window, 'resize')
          .pipe(
            debounceTime(1000),
            takeUntil(this._unsubscriber$)
          ).subscribe((evt: any) => {
            this._setScreenWidth(evt.target.innerWidth);
            this._setMediaBreakpoint(evt.target.innerWidth);
          });
      }
    
      ngOnDestroy() {
        this._unsubscriber$.next();
        this._unsubscriber$.complete();
      }
    
      private _setScreenWidth(width: number): void {
        this.screenWidth$.next(width);
      }
    
      private _setMediaBreakpoint(width: number): void {
        if (width < 576) {
          this.mediaBreakpoint$.next('xs');
        } else if (width >= 576 && width < 768) {
          this.mediaBreakpoint$.next('sm');
        } else if (width >= 768 && width < 992) {
          this.mediaBreakpoint$.next('md');
        } else if (width >= 992 && width < 1200) {
          this.mediaBreakpoint$.next('lg');
        } else if (width >= 1200 && width < 1600) {
          this.mediaBreakpoint$.next('xl');
        } else {
          this.mediaBreakpoint$.next('xxl');
        }
      }
    
    }
    
    

    Hope this helps someone

    0 讨论(0)
  • 2020-12-04 06:51

    To get it on init

    public innerWidth: any;
    ngOnInit() {
        this.innerWidth = window.innerWidth;
    }
    

    If you wanna keep it updated on resize:

    @HostListener('window:resize', ['$event'])
    onResize(event) {
      this.innerWidth = window.innerWidth;
    }
    
    0 讨论(0)
提交回复
热议问题