【问题标题】:Behaviour Subject Sidenav Toggle Angular 7 Material行为主题 Sidenav 切换 Angular 7 材质
【发布时间】:2019-03-28 22:40:39
【问题描述】:

我正在使用有角度的材料,并且我已将 sidenav 切换按钮放置在导航栏中。我正在尝试订阅一个布尔值来切换 sidenav。布尔值将传递给其中一个子组件。

我的服务:

 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);

    };
  }

我已注入服务并将其提供给组件的提供程序。我订阅了子组件侧边栏组件中的 observable,例如:

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

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

  }

问题是数据在组件加载时只订阅一次,当布尔值改变时不会改变。我如何在 updateData() 时持续监听布尔值的变化 叫什么?

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>

【问题讨论】:

  • 给我看看你的html?
  • 我已经更新了html代码@SheikAlthaf
  • 而不是BehaviorSubject为什么你不是Input Output事件
  • 您的console.log("RECEIVED DATA",data); 在每次updateData 调用时记录的值是否正确?
  • 接收数据的 console.log 仅在第一次加载页面时打印一次 @ashish.gd

标签: angular angular7 angular-material-6


【解决方案1】:

尝试使用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>

【讨论】:

  • 试过兄弟,对不起,但不起作用。当我使用按钮切换时,更改的切换是控制台日志记录正确。但是 sidenavService.sidenav$ 仍然是 false
  • 尝试像这样打印数据并将 {{navItem.text}} 打印到 {{sidenavService.sidenav$.value}}。并在切换后检查您所获得的价值
  • 我试过了,但是用 {{sidenavService.sidenav$}} 。它总是打印出 false ..用 ".value" 。它没有打印出任何东西
  • {{sidenavService.sidenav$}} 现在正在打印 [Object object']
  • 我用两个按钮编辑了答案。试试看,让我知道
猜你喜欢
  • 2017-02-21
  • 2020-08-05
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多