5

我可以使用打开的属性或 open() 方法和 flex-layout 响应式 api 使我的 mat-sidenav 响应吗?喜欢<mat-sidenav #sidenav mode="side" opened="true" [fxFlex.xs]="sidenav.close()">

4

3 回答 3

10

您可以考虑使用@angular/flex-alyout ObservableMedia来监视媒体/断点更改并mode根据活动媒体级别相应地更新或其他属性。这是通过订阅注入的ObservableMedia服务实例并检查活动媒体级别来完成的。然后,您可以通过一种方式将属性opened绑定到您的类属性。如果需要,可以将此逻辑放入服务和/或属性指令中。mode <md-sidenav>[]

使用/更新属性而不是应用 CSS 更改将确保发生正确的动画。

TS:

import { Component } from '@angular/core';
import { MediaChange, ObservableMedia } from "@angular/flex-layout";

@Component({ ... })
export class AppComponent  {
  mode: string = 'side';
  opened: boolean = true;

  constructor(private media: ObservableMedia) {
    this.media.subscribe((mediaChange: MediaChange) => {
      this.mode = this.getMode(mediaChange);
      // this.opened = this.getOpened(mediaChange);
    });
  }

  private getMode(mediaChange: MediaChange): string {
    // set mode based on a breakpoint
    if (this.media.isActive('gt-sm')) {
      return 'side';
    } else {
      return 'over';
    }
  }

  // open/close as needed
  private getOpened(mediaChange: MediaChange): string { }
}

HTML:

<md-sidenav-container class="example-container">
  <md-sidenav #sidenav class="example-sidenav" [opened]="opened" [mode]="mode">
    Jolly good!
  </md-sidenav>

  <div class="example-sidenav-content">
    <p>Sidenav content</p>

    <button type="button" md-button (click)="sidenav.open()">
      Open sidenav
    </button>
  </div>

</md-sidenav-container>
于 2017-10-11T16:22:01.823 回答
0

一种方法是使用 flex 处理 css 中的响应性,方法是根据其打开或关闭为 mat-sidenav 提供一个类。

<mat-sidenav [ngClass]="sidenav.opened ? 'sideOpened' : 'sideClosed'"> 

.css

    .sideOpened {
    // Handle Responsiveness
    }
    .sideClosed {
    // Handle Responsiveness
    }
于 2017-10-11T15:16:33.657 回答
0

@AlexanderStaroselsky 的答案很棒,但对于较新的版本已经过时/不推荐使用。

正如他所说,如果您使用flex-layout,您可以使用来自响应式 API的 MediaQueries :

TS

import { Component } from '@angular/core';
import { MediaChange, MediaObserver } from '@angular/flex-layout';

@Component({
    selector: 'app-component',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent  {
  sidenavMode: string = 'side';

  constructor(private media: ObservableMedia) {
    this.media.asObservable().subscribe((mediaChange: MediaChange[]) => {
         this.sidenavMode = this.getMode(mediaChange);
    });
  }

  private getMode(mediaChange: MediaChange[]): string {
     return this.media.isActive('gt-sm') ? 'side' : 'over';
  }

}

HTML

<mat-drawer-container hasBackdrop="false">
    <mat-drawer [mode]="sidenavMode">
        Sidenav
    </mat-drawer>
    <div>
        Hello world !
    </div>
</mat-drawer-container>

在此示例中,当屏幕宽度低于 960 像素时,模式将结束。

于 2020-11-05T18:03:17.847 回答