首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular-Material Sidenav

Angular-Material Sidenav
EN

Stack Overflow用户
提问于 2017-11-28 18:09:17
回答 2查看 19.7K关注 0票数 15

Angular材质CDK提供了一个Directive CdkScrollable,它允许您监听特定容器的ScrollEvent

我现在正在尝试访问MatSidenavContentCdkScrollable,它是默认添加的。

但是,我的@ViewChild(CdkScrollable)@ContentChild(CdkScrollable)总是未定义的。

我的Component看起来像这样:

代码语言:javascript
复制
<mat-sidenav-container>
    <mat-sidenav>Sidenav content</mat-sidenav>
    <div>Main content</div>
</mat-sidenav-container>

生成的DOM如下所示:

代码语言:javascript
复制
<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>

自动生成的mat-sidenav-content Component使用我需要访问的CdkScrollable-Directive。

我现在的问题是:

是否可以访问该Directive?如果可以,访问方式是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-27 21:53:10

前段时间我在@angular/material上发布了一个问题,现在他们公开了CdkScrollable-Instance。

要使用它,您需要使用@ViewChild(MatSidenavContainer访问MatSidenavContainer。此实例有一个公共成员CdkScrollable实例,即scrollable

可以在here中找到一个示例

编辑:由于示例不是非常完整,一些人在实现它时遇到了困难,我将在这里编写我自己的示例:

HTML

代码语言:javascript
复制
<mat-sidenav-container>
    <mat-sidenav #sidenav>
        Sidenav Content
    </mat-sidenav>
    <div>
        Main Content
    </div>
</mat-sidenav-container>

TypeScript:

代码语言:javascript
复制
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);
    }
}

重要

  1. 不要使用<mat-sidenav-content>。此标记是自动生成的,并且附加了cdkScrollable指令。如果您在自己的模板中使用<mat-sidenav-content>,则scrollable将是undefined.
  2. Use AfterViewInit而不是OnInit。据我所知,@ViewChild是在AfterViewInit中解决的,OnInit可能还为时过早。
票数 5
EN

Stack Overflow用户

发布于 2018-06-12 16:38:14

  1. 添加到您的应用程序模块导入:mat-sidenav-content

<mat-sidenav-content cdkScrollable> </mat-sidenav-content>

根组件中的

a)从@angular/cdk/overlay注入ScrollDispatcher并订阅滚动:

代码语言:javascript
复制
constructor(public scroll: ScrollDispatcher) {

    this.scrollingSubscription = this.scroll
          .scrolled()
          .subscribe((data: CdkScrollable) => {
            this.onWindowScroll(data);
          });
}

c)滚动时做一些事情,例如检查偏移

代码语言:javascript
复制
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;
  }

文档:https://material.angular.io/cdk/scrolling/api

更新Angular 9 :

使用import {ScrollingModule} from '@angular/cdk/scrolling'ScrollDispatchModule已弃用

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47528852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档