Определить, когда проверка валидатора не удалась

У нас есть линейный mat-horizontal-stepper Теперь мы хотим показать MatSnackBar когда пользователь пытается продолжить забытое обязательное поле.

CdkStepper кажется звонит _anyControlsInvalidOrPending молча и возвращает, если какой-либо ввод не действителен.

У кого-нибудь есть идеи, как обнаружить это событие?

Это должно быть обнаружено при звонке stepper.next(), stepper.previous() а также step.select()

3 ответа

Грязное решение будет

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

    };
  }

Вам нужно добавить "линейный" атрибут

<mat-vertical-stepper linear>

Это отключит переход к следующему шагу, если форма недействительна. Затем добавьте свою функцию проверки по нажатию кнопки, если форма недействительна, тогда вы можете показать предупреждение или снэк-бар или что угодно.

Если бы вы могли показать свой компонент и код шаблона, который содержит мат-степпер, это действительно помогло бы. Однако из вашего описания я считаю, что привязка к событию 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
  }
}
Другие вопросы по тегам