angular - 行为主题 Sidenav 切换 Angular 7 Material

标签 angular angular7 angular-material-6

我使用 Angular Material ,并且我已将侧导航切换按钮放置在导航栏中。我正在尝试订阅一个 bool 值来切换 sidenav。 bool 值将传递给子组件之一。

我的服务:

 import { Injectable } from '@angular/core';
import {BehaviorSubject, Observable} from 'rxjs'


@Injectable()
export class SidenavService {
    private sidenav$ : BehaviorSubject<boolean>;

    constructor() {
        this.sidenav$ = new BehaviorSubject<boolean>(false);
    }
    getData():Observable<boolean> {
        return this.sidenav$.asObservable();
    }

    updateData(data: boolean) {
        this.sidenav$.next(data);
        console.log("Changed toggle",data);

    }
}

我正在更新导航栏组件中的服务,例如:

  sidenavtoggle(){
    this.toggleSidenav.emit();
    this.isOpen = !this.isOpen;
    console.log("IS OPEN",this.isOpen);
    this.sidenavService.updateData(this.isOpen);

    };
  }

我已经注入(inject)了服务并将其提供给组件的提供者。我订阅了子组件侧边栏组件中的可观察对象,例如:

  constructor(private sidenavService:SidenavService) {
    this.prepareNavItems();

    this.subsciption=this.sidenavService.getData().subscribe(data=>{
      console.log("RECEIVED DATA",data);
      this.isExpanded=data;
    });

  }

问题在于,数据在组件加载时只订阅一次,并且当 bool 值改变时数据不会改变。如何在 updateData() 时持续监听 bool 值的变化 被称为?

HTML:

<mat-nav-list  >

  <div class="side-bar-btn" [ngClass]="{'is-active': toggle}" (click)="clickEvent($event)">
    <div class="side-bar-btn-box">
      <div class="side-bar-btn-inner"></div>
    </div>
  </div>

  <mat-list-item *ngFor="let navItem of navItems" routerLinkActive="sidebarlinkactive" routerLink="{{navItem.link}}" >
    <a routerLinkActive="active">
      <mat-icon mat-list-icon>{{navItem.icon}}</mat-icon>
      <div matLine *ngIf="isExpanded">{{navItem.text}}</div>
    </a>
  </mat-list-item>

</mat-nav-list>

最佳答案

尝试使用async管道,我还对您的代码进行了一些修改

import { Injectable } from '@angular/core';
import {BehaviorSubject, Observable} from 'rxjs'


@Injectable()
export class SidenavService {
    private sidenavSource$ = new BehaviorSubject<boolean>(false);
    sidenav$ = this.sidenavSource$.asObservable();

    updateData(data: boolean) {
        this.sidenavSource$.next(data);
        console.log("Changed toggle",data);

    }
}

在 HTML 中使用异步管道

constructor(public sidenavService: SidenavService) {} //make the service public

<div matLine *ngIf="sidenavService.sidenav$ | async">{{navItem.text}}</div>

<button (click)="sidenavService.updateData(true)">open</button>
<button (click)="sidenavService.updateData(false)">close</button>

关于angular - 行为主题 Sidenav 切换 Angular 7 Material ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55397468/

相关文章:

javascript - Mat-select 不显示所选值

angular-material-6 - StaticInjectorError(AppModule)[MatDialogTitle -> MatDialogRef]

Angular 5 HttpParams 未设置

javascript - 远离现有内容

c# - Dotnet core 3.1 和 Angular 9 的 AAD 注册

javascript - 在 Angular 7 中并排组合两个数组

Angular 7 ngFor 不更新绑定(bind)属性

angular - Angular 项目的 PhpStorm 语法问题

angular - 错误 TS2554 : Expected 2 arguments, 但使用 @ViewChild 得到 1

angular-material-6 - Angular 6 Material Dialog 字体差异和 Material Icon 大小修改