flu*_*nis 2 bootstrap-4 angular angular-reactive-forms
使用angular 7和Bootstrap 4,我想将Bootstrap 4输入包装在一个自定义组件中,以减少模板中的样板。
我希望最终的主要组件如下所示:
<form [formGroup]="myForm" (submit)="submit(myForm.value)">
<app-form-control label="Lastname" placeholder="Lastname" formControlName="lastName"></app-form-control>
<app-form-control label="Firstname" placeholder="Firstname" formControlName="firstName"></app-form-control>
<button class="pull-right" type="submit">
SUBMIT
</button>
<button (click)="reset()">
RESET
</button>
</form>
Run Code Online (Sandbox Code Playgroud)
我的formGroup是这样创建的:
public createFormGroup() {
return this.fb.group({
firstName: [null, Validators.required],
lastName: [null, Validators.required],
});
}
Run Code Online (Sandbox Code Playgroud)
app-form-control的模板应如下所示:
<div class="form-group row">
<label class="col-2 col-form-label">{{label}}</label>
<div class="col-10">
<input class="form-control" placeholder="{{placeholder}}" [formControlName]="formControlName" autocomplete="nope"/>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何编写组件(使用TypeScript)。如何将外部formControlName属性绑定到内部输入字段?如何使验证工作?
“键”正在使用viewProvider。您使用@Input设置为formControl赋值,请参见stackblitz。“魔术”是,如果相等,则在“孩子”中引用formControl或在父对象中引用form.get('input1')
@Component({
selector: 'app-form-control',
template: `
<div class="form-group row">
<label class="col-2 col-form-label">{{label}}</label>
<div class="col-10">
<input class="form-control" placeholder="{{placeholder}}"
[formControl]="formControl" autocomplete="nope"/>
</div>
</div>
<!--you can control the properties of formControl-->
{{formControl.valid}}{{formControl.touched}}}
`,
viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }]})
export class HelloComponent {
formControl: FormControl;
constructor(private parentF: FormGroupDirective) { }
@Input()
set controlName(value) {
this.formControl = this.parentF.form.get(value) as FormControl
}
@Input() label: string;
@Input() placeholder: string;
}
Run Code Online (Sandbox Code Playgroud)
并以这种方式调用组件:
<form [formGroup]="myForm" (submit)="submit(myForm.value)">
<app-form-control label="Lastname" placeholder="Lastname" controlName="lastName"></app-form-control>
</form>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
939 次 |
| 最近记录: |