现在我知道问题最初是指屏幕尺寸,所以基本上是width 和height 属性,但对于大多数人来说Breakpoints 才是真正重要的,因此,为了制定一个全局可重用的解决方案,我更愿意使用Angular 的BreakpointObserver 来处理这个问题。
以下配置基本上是service 和一些functions,可以return 和Observable<BreakpointState> 并在需要时成为subscribed:
import { Injectable } from '@angular/core';
import { BreakpointObserver, BreakpointState } from '@angular/cdk/layout';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root',
})
export class ScreenService {
constructor(private observer: BreakpointObserver) {}
isBelowSm(): Observable<BreakpointState> {
return this.observer.observe(['(max-width: 575px)']);
}
isBelowMd(): Observable<BreakpointState> {
return this.observer.observe(['(max-width: 767px)']);
}
isBelowLg(): Observable<BreakpointState> {
return this.observer.observe(['(max-width: 991px)']);
}
isBelowXl(): Observable<BreakpointState> {
return this.observer.observe(['(max-width: 1199px)']);
}
}
上面的代码可以调整以处理bootstrap方式的屏幕大小(通过将max-width更改为min-width并为每个值添加1px,当然还有反转functions名称.)
现在在component class 中,只需将subscribing 转换为上述任何函数返回的observable 即可。
即:app.component.ts:
export class AppComponent implements AfterViewInit {
isBelowLg: boolean;
constructor(private screenService: ScreenService) {}
ngAfterViewInit(): void {
this.screenService.isBelowLg().subscribe((isBelowLg: BreakpointState) => {
this.isBelowLg = isBelowLg.matches;
});
}
}
请参阅 AfterViewInit 生命周期钩子在视图初始化后使用 detectChanges() 会省去很多麻烦。
编辑:
作为AfterViewInit 的替代方案,它是相同的,但另外,您需要使用ChangeDetectorRef 到detectChanges(),只需在订阅组件中注入一个实例即:app.component.ts像这样:
constructor(
private screenService: ScreenService,
private cdref: ChangeDetectorRef
) {}
之后,只需拨打detectChanges() 即可:
this.cdref.detectChanges();