ここでは、私は、この私のフォームを形成しない方法です(覚えておいて、私は、フォームビルダで反応フォームをいない使用していますngModelを使用したテンプレート駆動型):
最初にを作成し、forms
というディレクトリにカスタムFormModuleを作成します。
次に、の中には、さまざまなフォームコンポーネントがあります。例えば、LoginFormComponent
を使ってみましょう。ここで
LoginFormComponent
次のとおりです。ここで
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'login-form',
templateUrl: './login-form.component.html'
})
export class LoginFormComponent implements OnInit {
@Output() onChange: EventEmitter<FormGroup> = new EventEmitter();
form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
email: [null, Validators.email],
password: [null, [Validators.required, Validators.minLength(6), Validators.maxLength(60)]]
});
this.form.valueChanges.subscribe(() => this.onChange.emit(this.form));
}
ngOnInit() {
this.onChange.emit(this.form);
}
}
はHTMLです:
<form autocomplete="off" [formGroup]="form">
<div class="form-group">
<label for="username">Email *</label>
<input type="text" id="username" class="form-control" placeholder="Enter your email address" formControlName="email" autofocus>
<control-messages [control]="form.get('email')"></control-messages>
</div>
<label for="password">Password *</label>
<input type="password" id="password" class="form-control" placeholder="Enter your password" formControlName="password">
<control-messages [control]="form.get('password')" [label]="'Password'"></control-messages>
</form>
今FormModule
をインポートモジュール内にある任意のカスタムコンポーネントでは、私は、次の操作を行うことができます。
app.component.html:
<login-form (onChange)="form = $event"></login-form>
<button (click)="submit()">Submit</button>
app.component.ts:
@Component({...})
export class AppComponent {
form: FormGroup;
submit() {
// Do something with `this.form`.
}
}
デザインのこの種の利点は、すぐにスーパーは明白ではないかもしれないが、それはいくつかのことを行うために私たちを可能にします:
- まず、
FormModule
というカスタムをインポートしている限り、login-form
コンポーネントをアプリのどこにでも再利用することができます。変更すれば、自動的にどこでも更新されます。物事をDRYに保ちます。
- 次に、同じ送信ボタン/テキストをどこにも置いておきたくない場合は、別の場所で別のものを実行したい場合があるので、
login-form
コンポーネントにはフォーム自体のみが含まれ、送信ロジックはその外部で処理されます再利用性のために。これは、作成と編集の両方に使用されるフォームがある場合に重要です。編集中のボタンはデータを保存することができます。作成時にボタンが新しいものを作成できるようになります。フォームコンポーネントの中にサブミットボタンを置くと、この再利用は容易に実現できません。この1つは除き、LoginFormComponent
と同じ一般的な考え方を以下の import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Tag } from 'shared';
@Component({
selector: 'tag-form',
templateUrl: './tag-form.component.html'
})
export class TagFormComponent implements OnInit {
@Output() onChange: EventEmitter<FormGroup> = new EventEmitter();
form: FormGroup;
constructor(private fb: FormBuilder) {
this.form = this.fb.group({
name: [null, Validators.email]
});
this.form.valueChanges.subscribe(() => {
this.onChange.emit(this.form);
});
}
@Input()
set tag(tag: Tag) {
if (tag) {
this.form.patchValue(tag);
}
}
ngOnInit() {
this.onChange.emit(this.form);
}
}
:
少し複雑なフォームの場合
は、いくつかのデフォルト値を取ることができますフォームは、この例TagFormComponent
を見てみましょうと言いますこれは、フォームのいくつかのデフォルト値を渡すことができます。このように:
<tag-form [tag]="tag" (onChange)="form = $event"></tag-form>
あなたはこのhttps://stackoverflow.com/questions/46002485/how-can-i-create-my-own-component-for-formcontrols/46002693#46002693をチェックしましたか?あなたの質問に似たもの –