我有一个包装的垫子手风琴组件的Angular material .当用户点击特定的手风琴时,我试图区分不同的手风琴.

以下是我的代码

Wrapper

Mat accordion HTML

<mat-accordion>
    <mat-expansion-panel (opened)="data.panelOpenState === true" (closed)="data.panelOpenState === false" [expanded]="data.expanded">
        <mat-expansion-panel-header (click)="stateValue()">
            <mat-panel-title>
                {{ data?.title }}
            </mat-panel-title>
        </mat-expansion-panel-header>
        <ng-content></ng-content>
    </mat-expansion-panel>
</mat-accordion>

Mat accordion TS

import { Component, Input, OnInit } from '@angular/core';
import { SidePanelAccordianData } from './side-panel-accordian.model';
import { SidePanelAccordianService } from './side-panel-accordian.service';

@Component({
  selector: 'app-side-panel-accordian',
  templateUrl: './side-panel-accordian.component.html',
  styleUrls: ['./side-panel-accordian.component.scss']
})
export class SidePanelAccordianComponent implements OnInit {
  @Input() data: SidePanelAccordianData;
  panelOpenState;

  constructor(private accordianStateService: SidePanelAccordianService) { }

  ngOnInit(): void {
  }

  stateValue() {
    this.data.panelOpenState = !this.data.panelOpenState;
    this.accordianStateService.setOpenState(this.data.panelOpenState);
  }

}

Mat accordion Service

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

@Injectable({
  providedIn: 'root'
})
export class SidePanelAccordianService {
  private _openStateBehaviorSubject = new BehaviorSubject(false);
  public openState$ = this._openStateBehaviorSubject.asObservable();

  public setOpenState(value: boolean) {
    this._openStateBehaviorSubject.next(value);
  }
}

Mat accordion model

export class SidePanelAccordianData {
  public title: string = '';
  public panelOpenState: boolean;
  public expanded: boolean;


  constructor(args) {
    this.title = args.title;
    this.panelOpenState = args.panelOpenState;
    this.expanded = args.expanded;
  }
}

Component where I am using the wrapper

HTML

<app-side-panel-accordian [data]="{title:'Title', panelOpenState: panelOpenState, expanded: firstDriverExpanded}">
    <div class="inner-row-data">
      <form-input [formStatus]="formStatus" [parentFormGroup]="setupForm" [data]="{
        formControlName: 'firstDriverName',
        name: 'firstDriverName',
      }" (onBlur)="setFirstDriverDetails('name')">
      </form-input>
    </div>
</app-side-panel-accordian>

<app-side-panel-accordian [data]="{title:'Title', panelOpenState: panelOpenState, expanded: secondDriverExpanded}">
    <div class="inner-row-data">
      <form-input [formStatus]="formStatus" [parentFormGroup]="setupForm" [data]="{
        formControlName: 'secondDriverName',
        name: 'secondDriverName',
      }" (onBlur)="setSecondDriverDetails('name')">
      </form-input>
    </div>
</app-side-panel-accordian>

TS

this.accordianStateService.openState$.subscribe(data =>{
  this.accordianState = data;
  if(!this.accordianState) {
    this.firstDriverExpanded = false;
    this.secondDriverExpanded = false;
  }
});

因此,正如您在上面的组件中看到的,我在其中使用了垫手风琴包装,我可以有多个手风琴,所以我的问题是,当this.accordianStateService.openState$值在单击时更新时,我将如何区分手风琴?

我需要区分的原因是因为我有规则来决定何时打开或关闭某个手风琴.

推荐答案

要在更新openState$值时区分手风琴,可以按如下方式修改代码:

  1. 更新SidePanelAccordianData模型以包括每个手风琴的标识符.例如:
export class SidePanelAccordianData {
  public id: string;
  public title: string = '';
  public panelOpenState: boolean;
  public expanded: boolean;

  constructor(args) {
    this.id = args.id;
    this.title = args.title;
    this.panelOpenState = args.panelOpenState;
    this.expanded = args.expanded;
  }
}
  1. 修改SidePanelAccordianComponent以随状态更改发出手风琴的标识符.按如下方式更新stateValue()方法:
stateValue() {
  this.data.panelOpenState = !this.data.panelOpenState;
  this.accordianStateService.setOpenState({ id: this.data.id, state: this.data.panelOpenState });
}
  1. 更新SidePanelAccordianService以随状态更改发出手风琴的标识符.按如下方式更新setOpenState()方法:
public setOpenState(data: { id: string, state: boolean }) {
  this._openStateBehaviorSubject.next(data);
}
  1. 在使用包装器的组件中,订阅openState$并根据手风琴的标识符来区分它们:
this.accordianStateService.openState$.subscribe(data => {
  const accordionId = data.id;
  const accordionState = data.state;

  if (accordionId === 'firstAccordionId') {
    // Handle state change for the first accordion
    this.firstDriverExpanded = accordionState;
  } else if (accordionId === 'secondAccordionId') {
    // Handle state change for the second accordion
    this.secondDriverExpanded = accordionState;
  }
});

确保用手风琴的实际标识符来替换'firstAccordionId''secondAccordionId'.

使用这种方法,您可以在更新openState$值时根据其标识符来区分手风琴,从而允许您分别处理每个手风琴的状态更改.

Angular相关问答推荐

HTTP Get请求未发送到提供的URL

Angular ngModel双向数据绑定不适用于表单中的Select元素

如何跨不同组件使用ng模板

我正在try 将一个带有模块联盟的Angular 8项目expose 到另一个Angular 项目,Angular 是15,这可能吗?如果是这样,有什么建议吗?

Angular 单调服务已多次创建

RxJS轮询+使用退避策略重试

Angular 组件存储,为什么我的效果可以';在http错误后不会被触发?

在Angular中扩展多个类

ngrx 效果等到从初始值以外的其他状态收到响应

NX如何在前端和后端使用一个接口库

MatTooltip 显示在 html 原生对话框下方

将 injectiontoken 用于 Angular 中的模块特定设置

Angular:try 在点击次数后禁用按钮

Angular 2 单元测试 - @ViewChild 未定义

在 Angular 2 中打印 Html 模板

Angular 6在输入键上添加输入

angular4的所见即所得编辑器

Angular 中 polyfills.ts 文件有什么用

Angular2material对话框自动关闭

Angular2:无法读取未定义的属性名称