检测 mat-stepper 验证何时失败

Posted

技术标签:

【中文标题】检测 mat-stepper 验证何时失败【英文标题】:Detect when mat-stepper validation fails 【发布时间】:2018-07-16 17:00:10 【问题描述】:

我们有一个线性的mat-horizontal-stepper,现在我们想在用户尝试继续忘记必填字段时显示MatSnackBar

CdkStepper 似乎默默地调用_anyControlsInvalidOrPending 并在任何输入无效时返回。

有人知道如何检测此事件吗?

调用stepper.next()stepper.previous()step.select()时必须检测到

【问题讨论】:

【参考方案1】:

一个肮脏的解决方案是

  ngAfterViewInit() 
    // when clicking on the step header
    this.stepper._steps.forEach((step) => 
      this.addPriorValidyCheckToFunction(step, 'select');
    );
    // when calling previous and next function
    this.addPriorValidyCheckToFunction(this.stepper, 'next');
    this.addPriorValidyCheckToFunction(this.stepper, 'previous');
  

  addPriorValidyCheckToFunction(object, functionName) 
    // keep reference to AppComponent
    let self = this;
    // keep reference to original function
    let oldFunction = object[functionName];
    // replace original function
    object[functionName] = function () 
      // remember step before calling the function
      let oldStep = self.stepper.selected;
      // call the original function
      oldFunction.call(object);
      // if step did not change and form is invalid, show the message
      if (oldStep == self.stepper.selected && !self.stepper.selected.stepControl.valid) 
        self.snackBar.open("Fehler", "Bitte überprüfen Sie Ihre Eingaben", 
          duration: 2000,
        );
      

    ;
  

【讨论】:

【参考方案2】:

你需要添加一个“线性”属性

<mat-vertical-stepper linear>

如果表单无效,这将禁止导航到下一步。 如果表单无效,然后单击按钮添加验证功能,然后您可以显示警报或小吃栏或任何您想要的。

【讨论】:

然后,警报将仅在按钮被舔时显示,但在 mat-step-header 被单击时不显示。 :(【参考方案3】:

如果您可以展示包含 mat-stepper 的组件和模板代码,那将很有帮助。但是,根据您的描述,我相信绑定到 selectionChange 事件对您有用。

在包含步进器的模板中: stepper-example.component.html

<mat-horizontal-stepper #stepper (selectionChange)="onStepChange($event)">
 <!-- your form -->
</mat-horizontal-stepper>

然后在您的组件中: stepper-example.component.ts

import  Component, ViewChild  from '@angular/core';
@Component(
  selector: 'stepper-example',
  templateUrl: './stepper-example.component.html'
)
export class StepperExampleComponent 
@ViewChild('stepper') stepper;


public onStepChange(event): void
    //Some logic to validate your forms
  

【讨论】:

以上是关于检测 mat-stepper 验证何时失败的主要内容,如果未能解决你的问题,请参考以下文章

检测阅读器何时关闭命名管道(FIFO)

Angular Material - 防止 mat-stepper 在步骤之间导航

如何检测何时按下 Enter 或按下提交 [重复]

SQL Server Express DB 处于“恢复中”-如何检测/知道何时恢复

Angular Material Mat-Stepper:如何为多个步骤使用相同的表单组?

验证失败:检测到的应用迁移未在本地解决 |飞路