狭い/広いビュー用のトグルボタン付きのサイドパネルがあります。
スクロールバーが表示(オーバーフロー)すると、スクロールバーがトグルボタンを非表示にするはずです。イベントハンドラでのスクロールバーの可視性の検出
hideOrShowToggleBtn
を直接呼び出すのではなく、ngAfterViewChecked
で使用できるプライベートプロパティを追加して、イベントごとに一度呼び出すことができます。また、ビューが更新された後に(うまくいけば)呼び出すことができます。
狭いビューに切り替えるとスクロールバーが表示される - element.clientHeight element.scrollHeight
は同じで、スクロールバーは検出されません。
おそらくngAfterViewChecked
が早すぎますが発生する可能性があります。
これを検出し、domが最新であり、スクロールバーが実際に追加される前に古いビューをチェックしていないことを確認するより良い方法はありますか?
@ViewChild('content') private mainContentDiv: ElementRef;
onSidebarToggleClick() {
this.largeSidebar = !this.largeSidebar;
this.sidebarToggled = true;
}
ngAfterViewChecked() {
if (this.sidebarToggled) {
this.hideOrShowToggleBtn();
}
}
hideOrShowToggleBtn() {
let element = this.mainContentDiv.nativeElement;
let style = element.ownerDocument.defaultView.getComputedStyle(element, undefined);
let hasScrollbar = (style.overflowY === 'auto' && element.clientHeight < element.scrollHeight);
this.hideToggle = !hasScrollbar && !this.largeSidebar;
this.sidebarToggled = false;
this.changeDetectorRef.detectChanges();
}
HTML:
<div class="sidebar-header">
<i class="sidebar-header-toggle fa fa-2x cursor"
(click)="onSidebarToggleClick()"
></i>
</div>
<div #content [ngClass]="{'sidebar-large': largeSidebar, 'sidebar-small': !largeSidebar }">
</div>
簡体Plunker:https://plnkr.co/edit/tv2quvCmzElZzidiRjTZ?p=preview