takesi-pekalamp
@takesi-pekalamp

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Angularのテンプレートで@ifディレクティブを使う際、ドット記法だとエラーになるがブラケット記法ならエラーにならない

解決したいこと

AngularnのValidatorの仕組みが知りたい!!:sob::sob::sob:

発生している問題・エラー

//テンプレートの実装
    <form [formGroup]="myGroup" (ngSubmit)="onSubmit()">
        <table>
            <tr>
                <th>Name</th>
                <td>
                    @if (myGroup.get('name')?.errors?.required){
                    Nameは必須項目です<br>
                    }
                    <input type="text" formControlName="name">
                </td>
            <tr>
        </table>
    </form>
//コンポーネントの実装
import { Component, OnInit } from '@angular/core';
import { FormControl, FormControlState, FormGroup, FormsModule, ReactiveFormsModule, FormBuilder, Validators } from '@angular/forms';
import { CommonModule } from '@angular/common';

@Component({
  selector: 'app-chap3',
  standalone: true,
  imports: [FormsModule, ReactiveFormsModule, CommonModule],
  templateUrl: './chap3.component.html',
  styleUrl: './chap3.component.css'
})
export class Chap3Component implements OnInit {
  myGroup!: FormGroup;

  constructor(private fb: FormBuilder) { }

  ngOnInit(): void {
    this.myGroup=this.fb.group({
      name: ['', [Validators.required]]
    });}

  get name() { return this.myGroup.get('name'); }
}
    

テンプレートで以下のエラーが起きる

image.png

該当するソースコード

@if (myGroup.get('name')?.errors?.required)

自分で試したこと

上記エラーの該当ソースを以下のようにドット記法からブラケット記法に変更すると
エラーはでなくなった。

@if (myGroup.get('name')?.errors?.['required'])

質問

なんでドット記法で出るエラーがブラケット記法だと出ないのか知りたいです!!!
AngularのValidetersクラスのrequiredメソッドの作り的な問題?

参考にしたページ

https://v17.angular.io/guide/form-validation
https://qiita.com/TakanoriOkawa/items/7de0b158afa17ef2dae8

0

1Answer

comes from an index signature で検索したら解説が見つかりました。

Angular の ValidationErrors は以下の型になっています。このプロパティにアクセスするときは、 TypeScript の型チェックによってブラケット記法が強制されます。

// https://angular.io/api/forms/ValidationErrors
type ValidationErrors = {
    [key: string]: any;
};

ただし、 TypeScript の noPropertyAccessFromIndexSignature オプションをオフにすることでこのチェックを無効化でき、ドット記法でアクセスできるようになります。

このチェックがある理由は、(プロパティ名が自由であるために)プロパティが存在しない可能性があることをコード上で分かりやすくするためとのことです。

1Like

Comments

  1. ご回答ありがとうございました!
    参考のリンクまで載せていただいて助かります!!

Your answer might help someone💌