Пользовательский интерфейс Angular Material – Как добавить проверку onBlur для флажков/переключателей?

Я пытаюсь создать несколько простых флажков и переключателей с помощью пользовательского интерфейса Angular Material. Проблема, с которой я столкнулся, заключается в получении эффекта красного контура onBlur, когда поле является обязательным, а пользователь не выбирает опцию. Я добавил валидатор requireTrue, но он не работает. Пример HTML ниже.

    <div>
        @for (i of checkboxValues; track i){
            <mat-checkbox 
                [value] = "i.key"
                [checked] = "i.selected"             
            >
                {{i.value}}
            </mat-checkbox>
        }
    </div>
<mat-radio-group [formControl] = "radioFormControl">
    @for (i of radioValues; track i){        
        <mat-radio-button 
            [value] = "opt" 
        >
            {{i.value}}
        </mat-radio-button>
    }
</mat-radio-group>

Я попытался обернуть <mat-option> и <mat-checkboxes> в <mat-form-field>, но в итоге получил ошибку, связанную с «Ошибка: поле mat-form-field должно содержать MatFormFieldControl», которую я не могу устранить. Я новичок в angular, так что, возможно, мне чего-то не хватает.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ответ на ваш вопрос — использовать собственный CSS для создания красной рамки. CSS будет выглядеть, как показано ниже.

.mat-mdc-radio-group.ng-touched.ng-invalid {
  .mdc-radio__outer-circle {
    border-color: red !important;
  }
  .mdc-label {
    color: red;
  }
}

.mat-mdc-checkbox.ng-touched.ng-invalid {
  .mdc-checkbox__background {
    border-color: red !important;
  }
  .mdc-label {
    color: red !important;
  }
}

Основная проблема в вашем подходе связана с флажками, красную проверку невозможно разместить, если только вы не хотите, чтобы пользователь обязательно проверял флажок. В остальном это можно легко сделать для радиогруппы, без поля формы мата.

Полный код:

HTML:

<form [formGroup] = "form" (ngSubmit) = "form.markAllAsTouched();">
  <mat-label>Enter your Selection</mat-label>
  <br />
  <mat-radio-group aria-label = "Select an option" formControlName = "radios">
    @for (item of radioValues; track item){
    <mat-radio-button [value] = "item.id">{{item.label}}</mat-radio-button>
    }
  </mat-radio-group>
  <br />
  @if (form.get('radios'); as radio) { @if (radio?.touched &&
  radio?.errors?.required) {
  <mat-error>Selection is required</mat-error>
  } }
  <hr />
  <mat-label>Enter your Checkboxes</mat-label>
  @for (item of checkboxValues; track item){
  <mat-checkbox [value] = "item.key" [formControlName] = "item.value">
    {{item.value}}
  </mat-checkbox>
  }
  <hr />
  <br />
  <button type = "submit">submit</button>
</form>

ТС:

import { Component } from '@angular/core';
import {
  FormControl,
  FormGroup,
  ReactiveFormsModule,
  Validators,
} from '@angular/forms';
import { MatRadioModule } from '@angular/material/radio';
import { MatCheckboxModule } from '@angular/material/checkbox';
import { MatFormFieldModule } from '@angular/material/form-field';
import { CommonModule } from '@angular/common';

/**
 * @title Basic radios
 */
@Component({
  selector: 'radio-overview-example',
  templateUrl: 'radio-overview-example.html',
  styleUrl: 'radio-overview-example.css',
  standalone: true,
  imports: [
    MatRadioModule,
    ReactiveFormsModule,
    MatCheckboxModule,
    CommonModule,
    MatFormFieldModule,
  ],
})
export class RadioOverviewExample {
  radioValues = [
    { id: 1, label: 'apple' },
    { id: 2, label: 'banana' },
  ];
  checkboxValues = [
    { key: 'apple', value: 'apple', selected: false },
    { key: 'banana', value: 'banana', selected: false },
    { key: 'orange', value: 'orange', selected: false },
  ];
  form = new FormGroup({
    radios: new FormControl(null, Validators.required),
  });

  ngOnInit() {
    this.checkboxValues.forEach((item: any) => {
      this.form.addControl(
        item.value,
        new FormControl(null, Validators.required)
      );
    });
    // this.form.get('radios')!.markAsTouched();
    // this.form.get('radios')!.markAsDirty();
  }
}

Нажмите «Отправить», чтобы увидеть ошибки.

Демо-версия Stackblitz

Разве материал-ui не предоставляет эту встроенную функцию для флажков/радио? Я нахожу это странным, поскольку они предоставляют эту функцию для текста, выбора и т. д.

bestfirstsearch 26.06.2024 06:44

@bestfirstsearch Обычно это нестандартное сообщение о проверке флажков и переключателей, потому что обычно один из переключателей проверяется. Что касается флажков, как я объяснил, флажок может быть ложным, но это не значит, что он недействителен, поэтому нам нужно создать специальную проверку, соответствующую нашим требованиям.

Naren Murali 26.06.2024 06:47

Другие вопросы по теме