Spr*_*bua 10 scroll typescript angular-material2 angular angular-cdk
Angular Material CDK提供了一个Directive CdkScrollable,它允许您监听ScrollEvent特定容器的s.
我现在想访问CdkScrollable的MatSidenavContent,这是默认添加.
但是我的@ViewChild(CdkScrollable)和@ContentChild(CdkScrollable)总是未定义的.
我Component看起来像这样:
<mat-sidenav-container>
<mat-sidenav>Sidenav content</mat-sidenav>
<div>Main content</div>
</mat-sidenav-container>
Run Code Online (Sandbox Code Playgroud)
生成的DOM看起来像这样:
<mat-sidenav-container>
<div class="mat-drawer-backdrop"></div>
<div tabindex="-1" class="cdk-visually-hidden cdk-focus-trap-anchor"></div>
<mat-sidenav>Sidenav content</mat-sidenav>
<mat-sidenav-content cdkScrollable>
<div>Main content</div>
</mat-sidenav-content>
</mat-sidenav-container>
Run Code Online (Sandbox Code Playgroud)
的mat-sidenav-content Component,这是自动生成的,采用的是CdkScrollable-Directive,我需要访问.
我现在的问题是:
是否有可能访问它Directive,如果可以,如何访问?
Seb*_*nis 12
<mat-sidenav-content cdkScrollable> </ mat-sidenav-content>
a)从@ angular/cdk/overlay注入ScrollDispatcher并订阅滚动:
constructor(public scroll: ScrollDispatcher) {
this.scrollingSubscription = this.scroll
.scrolled()
.subscribe((data: CdkScrollable) => {
this.onWindowScroll(data);
});
}
Run Code Online (Sandbox Code Playgroud)
c)滚动时执行某些操作,例如检查偏移量
private onWindowScroll(data: CdkScrollable) {
const scrollTop = data.getElementRef().nativeElement.scrollTop || 0;
if (this.lastOffset > scrollTop) {
// console.log('Show toolbar');
} else if (scrollTop < 10) {
// console.log('Show toolbar');
} else if (scrollTop > 100) {
// console.log('Hide toolbar');
}
this.lastOffset = scrollTop;
}
Run Code Online (Sandbox Code Playgroud)
文档:https://material.angular.io/cdk/scrolling/api
前段时间我在@angular/material 上打开了一个问题,他们现在公开了CdkScrollable-Instance。
要使用它,您需要访问MatSidenavContainerusing @ViewChild(MatSidenavContainer。此实例有一个公共成员scrollable,即CdkScrollable实例。
一个例子可以在这里找到
编辑: 由于示例不是很完整,并且有些人在实现它时遇到了困难,我将在这里编写自己的示例:
HTML :
<mat-sidenav-container>
<mat-sidenav #sidenav>
Sidenav Content
</mat-sidenav>
<div>
Main Content
</div>
</mat-sidenav-container>
Run Code Online (Sandbox Code Playgroud)
打字稿:
import { Component, AfterViewInit, ViewChild } from '@angular/core';
import { MatSidenavContainer } from '@angular/material';
@Component({
selector: 'my-app',
templateUrl: './app.component.html',
styleUrls: [ './app.component.css' ]
})
export class AppComponent implements AfterViewInit {
@ViewChild(MatSidenavContainer) sidenavContainer: MatSidenavContainer;
constructor() {
}
ngAfterViewInit() {
console.log(this.sidenavContainer.scrollable);
}
}
Run Code Online (Sandbox Code Playgroud)
重要:
<mat-sidenav-content>. 这个标签是自动生成的,并且cdkScrollable附有指令。如果您<mat-sidenav-content>在自己的模板中使用,scrollable则将是未定义的。AfterViewInit代替OnInit。据我所知,@ViewChild在 中解决AfterViewInit,OnInit可能还为时过早。| 归档时间: |
|
| 查看次数: |
9942 次 |
| 最近记录: |