【发布时间】:2021-08-25 12:12:04
【问题描述】:
我正在尝试创建一个 observable,如果窗口屏幕小于 520 像素,它将发出 true 或 false 值。 所以我在下面有这段代码:
@Injectable({
providedIn: 'root'
})
export class ResizeService {
private mobileView$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
mobileViewObs$ = this.mobileView$.asObservable();
isMobile = false;
size!: {width: number, height: number};
constructor() {
}
resizeEvent(){
fromEvent(window, 'resize').pipe(throttleTime(500), debounceTime(500)).subscribe((resizeEvent: any) => {
this.size = {
width: +resizeEvent.currentTarget.innerWidth,
height: +resizeEvent.currentTarget.innerHeight
};
this.isMobile = this.isMobileView(this.size);
this.mobileView$.next(this.isMobile);
});;
}
isMobileView(size: {width: number, height: number}){
if(size.width < PHONE_SIZE.width && size.height < PHONE_SIZE.height){
return true;
} else {
return false;
}
}
}
它工作正常,但问题是我无法设置页面的初始大小。我不知道如何将大小对象从组件发送到服务。这是我的component.ts:
@Component({
selector: 'app-books-list',
templateUrl: './books-list.component.html',
styleUrls: ['./books-list.component.scss'],
})
export class BooksListComponent implements OnInit {
@Input() book!: BookModel;
booksArray: BookModel[] = [];
oneBook!: BookModel;
isMobile: boolean = false;
size!: {width: number, height: number};
constructor(private service: BookService, private route: ActivatedRoute,
private resizeService: ResizeService) {}
ngOnInit(): void {
this.size = {width: window.innerWidth, height: window.innerHeight};
this.resizeService.resizeEvent();
this.resizeService.mobileViewObs$.subscribe(data => {
this.isMobile = data;
})
this.service.getBooks().subscribe((books) => {
this.booksArray = books;
});
}
问题在于,第一次重新加载页面时,它总是显示为 false,因为 observable 仅在 resize 事件中创建。你知道如何实现这个功能吗?
【问题讨论】:
-
请使用三重反引号包装器 ` ` code ` ` ` 粘贴您的代码(中间没有空格)
标签: angular typescript components observable behaviorsubject