首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >制作一个简化的角度材料手风琴,但输出事件没有捕捉到。

制作一个简化的角度材料手风琴,但输出事件没有捕捉到。
EN

Stack Overflow用户
提问于 2020-02-13 19:48:02
回答 1查看 283关注 0票数 0

我试图简化角度的材料手风琴,通过我自己的版本,这是试图简化它一点。我有一个步进组件

代码语言:javascript
复制
<mat-accordion>
    <ng-content>
    </ng-content>
</mat-accordion>

这非常简单,并且有以下方法:

代码语言:javascript
复制
import {
  Component,
  AfterViewInit,
  QueryList,
  ContentChildren,
  OnDestroy,
  Input
} from "@angular/core";
import { StepComponent } from "./step.component";
import { Subscription } from "rxjs";

@Component({
  selector: "app-stepper",
  templateUrl: "./stepper.component.html",
  styleUrls: ["./stepper.component.scss"]
})
export class StepperComponent implements AfterViewInit, OnDestroy {
  @Input() closeOthers: boolean = true;
  @ContentChildren(StepComponent) children: QueryList<any>;

  step = 0;
  private subscriptions: Subscription = new Subscription();

  constructor() {}

  ngAfterViewInit() {
    this.children.forEach((child: StepComponent, i: number) => {
      this.subscriptions.add(
        child.animate.subscribe(() => {
          this.setStep(i);
        })
      );
    });
  }

  ngOnDestroy() {
    this.subscriptions.unsubscribe();
  }

  setStep(index: number) {
    this.step = index;
    console.log(this.step);
  }

  nextStep() {
    this.step++;
    console.log(this.step);
  }

  prevStep() {
    this.step--;
    console.log(this.step);
  }
}

请注意children订阅。

然后我创建了一个step组件

代码语言:javascript
复制
<mat-expansion-panel [expanded]="expanded"
    (click)="animateMe()">
    <mat-expansion-panel-header>
        <mat-panel-title>
            {{name}}
        </mat-panel-title>
    </mat-expansion-panel-header>
    <div>
        <ng-content>
        </ng-content>
    </div>
</mat-expansion-panel>

这就是我想隐藏手风琴步骤的复杂性的地方。目前它是基本的,但请容忍我。然后我的代码看起来如下:

代码语言:javascript
复制
import { Component, OnInit, Input, Output, EventEmitter } from "@angular/core";

@Component({
  selector: "app-step",
  templateUrl: "./step.component.html",
  styleUrls: ["./step.component.scss"]
})
export class StepComponent implements OnInit {
  @Input() name: string;
  @Input() expanded: boolean;
  @Output() animate: EventEmitter<void> = new EventEmitter<void>();

  constructor() {}

  ngOnInit() {}

  animateMe() {
    console.log("clicked");
    this.animate.emit();
  }
}

注意Output事件。因此,在我的组件中,我现在有以下内容:

代码语言:javascript
复制
<app-stepper #stepper>
    <app-step name="Hall"
        *ngIf="hall"
        [expanded]="stepper.step === 0">


        <!-- emitted for brevity -->

        <button mat-raised-button
            type="button"
            color="primary"
            (click)="stepper.nextStep()">Next</button>
    </app-step>
    <app-step name="Video"
        [expanded]="stepper.step === 1">

        <!-- emitted for brevity -->

        </form>
    </app-step>
</app-stepper>

当我按下下一步的按钮时,它确实扩展了这个“步骤”。但是,如果我单击任何一个标头,虽然我确实看到了控制台日志(因此事件发射器实际上正在发出),但订阅不会被捕获,因此“步骤”不会被重置。

有人知道为什么我的代码:

代码语言:javascript
复制
this.children.forEach((child: StepComponent, i: number) => {
  this.subscriptions.add(
    child.animate.subscribe(() => {
      this.setStep(i);
    })
  );
});

不是被抓了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-13 20:25:38

我创建了一个stackblitz,因为这似乎是一个有趣的问题。

如果我正确地理解了这个问题,我认为它实际上是一个#简单的修复。

我已经将click事件从step组件中的mat-expansion-panel移动到mat-expansion-header

代码语言:javascript
复制
<mat-expansion-panel [expanded]="expanded">
    <mat-expansion-panel-header (click)="animateMe()">
    </mat-expansion-panel-header>
</mat-expansion-panel>

正如您所说,订阅正在启动,但是单击处理程序覆盖了对nextStep的调用,导致其重置。

我想我误解了这个问题的简单性吗?

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

https://stackoverflow.com/questions/60215425

复制
相关文章

相似问题

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