状況
現在、Angularチュートリアル等でフォームについて学習している初学者です。
constructorとngOnInitの違いについて、なかなか腑に落ちないので、アドバイスいただければ幸いです。
やろうとしていること
こちらのリンクのカスタムバリデーションを自分のローカル環境でも実装してみました。
https://stackblitz.com/edit/angular-u1a86m?file=src%2Fapp%2Fapp.component.ts
とりあえず、完コピしてみたのですが、Property 'form' has no initializer and is not definitely assigned in the constructor.
というエラーが出てしまいます。
コンストラクターで初期化出来ていないというエラーだと思い、ngOnInit()
に書かれている処理を全てconstructor
に移動しました。そうすると、問題なく動作し、上記リンクとstackblitzと同じ挙動で動いています。
コード
typescript
1// test.component.ts 2import { Component, OnInit } from '@angular/core'; 3import { 4 FormGroup, 5 FormControl, 6 FormBuilder, 7 Validators, 8 AbstractControl, 9} from '@angular/forms'; 10@Component({ 11 selector: 'app-test', 12 templateUrl: './test.component.html', 13 styleUrls: ['./test.component.scss'], 14}) 15export class TestComponent implements OnInit { 16 form: FormGroup; 17 18 constructor(private _fb: FormBuilder) { 19 this.form = this._buildForm(); 20 } 21 22 ngOnInit() { 23 // this.form = this._buildForm(); stackblitzはここで初期化している。 24 } 25 26 submit(form: FormGroup) { 27 console.log(form); 28 } 29 30 get phonenumber() { 31 return <FormControl>this.form.get('phonenumber'); 32 } 33 34 private _buildForm(): FormGroup { 35 return this._fb.group({ 36 phonenumber: ['', [Validators.required, parseToNumberValidator]], 37 }); 38 } 39} 40function parseToNumberValidator(formControl: AbstractControl) { 41 const val = formControl.value; 42 return isNaN(Number(val)) ? { parseToNumberValidator: true } : null; 43} 44
typescript
1// test.component.ts 2<p>Start editing to see some magic happen :)</p> 3<form [formGroup]="form" (submit)="submit(form)"> 4 <div> 5 <label> 6 phone number 7 <input type="text" formControlName="phonenumber" *ngIf="phonenumber" /> 8 </label> 9 <ng-container 10 *ngIf="phonenumber.invalid && (phonenumber.touched || phonenumber.dirty)" 11 > 12 <p *ngIf="phonenumber.hasError('required')">必須項目です</p> 13 <p *ngIf="phonenumber.hasError('parseToNumberValidator')">半角数字のみ</p> 14 </ng-container> 15 </div> 16 <div> 17 <button type="submit">send</button> 18 </div> 19</form> 20
わからないこと
・なぜ、上記リンクのstackblitzはconstructorで初期化していないのにエラーがでないのか。
(自分のローカル環境だけエラーになるのはなぜか)
・ngOnInitとconstructorをどう使い分けたらよいかわからない。
環境的な要素が原因で、エラーとなっているのでしょうか。
ng newで新規プロジェクトを作成し、同様のことをしてもやはり同じ状況になってしまいます。
どういったところに原因がありそうか、アドバイス頂けると幸いです。
(teratail内で似たような質問をしてしまっています…すみません…)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/22 14:16
2021/08/22 14:26