angular 创建可重复使用的输入组件
angular create input component reusable
我正在创建一个带有验证器的可重用文本组件
export class CompInputComponent implements OnInit{
@Input() controlFormGroup: FormGroup;
@Input() controlLabel: string;
@Input() controlPlaceHolder: string;
@Input() controlName: string;
@Input() errorMessage: string;
private _isRequired = false;
@Input()
get isRequired(): boolean {
return this._isRequired;
}
set isRequired(val: boolean) {
this._isRequired = coerceBooleanProperty(val);
}
@Output() onComponentReady: EventEmitter<FormGroup> = new EventEmitter<FormGroup>();
constructor(private fb: FormBuilder) { }
ngOnInit(){
console.log(this.isRequired);
if(this.isRequired){
console.log(this.isRequired);
this.controlFormGroup.addControl(this.controlName, new FormControl('', Validators.required));
}else{
this.controlFormGroup.addControl(this.controlName, new FormControl(''));
}
this.onComponentReady.emit(this.controlFormGroup);
}
}
<div [formGroup]="controlFormGroup">
<mat-form-field appearance="outline">
<mat-label>{{controlLabel}}</mat-label>
<input matInput [placeholder]="controlPlaceHolder" [formControlName]="controlName" />
<mat-error *ngIf="controlFormGroup.controls.controlName.hasError('required')">">
<span [innerHTML]="errorMessage"></span>
</mat-error>
</mat-form-field>
</div>
我的问题是无法设置mat-error。我有以下错误:
core.js:5967 错误类型错误:无法读取未定义的 属性 'hasError'
在 CompInputComponent_Template
控件的名字不硬而且动态
这应该可行,您正在动态创建表单控件,这意味着它们一开始并不存在。您需要检查是否创建了表单控件。
export class CompInputComponent implements OnInit{
@Input() controlFormGroup: FormGroup;
@Input() controlLabel: string;
@Input() controlPlaceHolder: string;
@Input() controlName: string;
@Input() errorMessage: string;
private _isRequired = false;
@Input()
get isRequired(): boolean {
return this._isRequired;
}
set isRequired(val: boolean) {
this._isRequired = coerceBooleanProperty(val);
}
@Output() onComponentReady: EventEmitter<FormGroup> = new EventEmitter<FormGroup>();
constructor(private fb: FormBuilder) { }
ngOnInit(){
console.log(this.isRequired);
if(this.isRequired){
console.log(this.isRequired);
this.controlFormGroup.addControl(this.controlName, new FormControl('', Validators.required));
}else{
this.controlFormGroup.addControl(this.controlName, new FormControl(''));
}
this.onComponentReady.emit(this.controlFormGroup);
}
}
<div [formGroup]="controlFormGroup">
<mat-form-field appearance="outline">
<mat-label>{{controlLabel}}</mat-label>
<input matInput [placeholder]="controlPlaceHolder" [formControlName]="controlName" />
<mat-error *ngIf="!!controlFormGroup.controls.controlName && controlFormGroup.controls.controlName.hasError('required')">">
<span [innerHTML]="errorMessage"></span>
</mat-error>
</mat-form-field>
</div>
我正在创建一个带有验证器的可重用文本组件
export class CompInputComponent implements OnInit{
@Input() controlFormGroup: FormGroup;
@Input() controlLabel: string;
@Input() controlPlaceHolder: string;
@Input() controlName: string;
@Input() errorMessage: string;
private _isRequired = false;
@Input()
get isRequired(): boolean {
return this._isRequired;
}
set isRequired(val: boolean) {
this._isRequired = coerceBooleanProperty(val);
}
@Output() onComponentReady: EventEmitter<FormGroup> = new EventEmitter<FormGroup>();
constructor(private fb: FormBuilder) { }
ngOnInit(){
console.log(this.isRequired);
if(this.isRequired){
console.log(this.isRequired);
this.controlFormGroup.addControl(this.controlName, new FormControl('', Validators.required));
}else{
this.controlFormGroup.addControl(this.controlName, new FormControl(''));
}
this.onComponentReady.emit(this.controlFormGroup);
}
}
<div [formGroup]="controlFormGroup">
<mat-form-field appearance="outline">
<mat-label>{{controlLabel}}</mat-label>
<input matInput [placeholder]="controlPlaceHolder" [formControlName]="controlName" />
<mat-error *ngIf="controlFormGroup.controls.controlName.hasError('required')">">
<span [innerHTML]="errorMessage"></span>
</mat-error>
</mat-form-field>
</div>
我的问题是无法设置mat-error。我有以下错误:
core.js:5967 错误类型错误:无法读取未定义的 属性 'hasError' 在 CompInputComponent_Template
控件的名字不硬而且动态
这应该可行,您正在动态创建表单控件,这意味着它们一开始并不存在。您需要检查是否创建了表单控件。
export class CompInputComponent implements OnInit{
@Input() controlFormGroup: FormGroup;
@Input() controlLabel: string;
@Input() controlPlaceHolder: string;
@Input() controlName: string;
@Input() errorMessage: string;
private _isRequired = false;
@Input()
get isRequired(): boolean {
return this._isRequired;
}
set isRequired(val: boolean) {
this._isRequired = coerceBooleanProperty(val);
}
@Output() onComponentReady: EventEmitter<FormGroup> = new EventEmitter<FormGroup>();
constructor(private fb: FormBuilder) { }
ngOnInit(){
console.log(this.isRequired);
if(this.isRequired){
console.log(this.isRequired);
this.controlFormGroup.addControl(this.controlName, new FormControl('', Validators.required));
}else{
this.controlFormGroup.addControl(this.controlName, new FormControl(''));
}
this.onComponentReady.emit(this.controlFormGroup);
}
}
<div [formGroup]="controlFormGroup">
<mat-form-field appearance="outline">
<mat-label>{{controlLabel}}</mat-label>
<input matInput [placeholder]="controlPlaceHolder" [formControlName]="controlName" />
<mat-error *ngIf="!!controlFormGroup.controls.controlName && controlFormGroup.controls.controlName.hasError('required')">">
<span [innerHTML]="errorMessage"></span>
</mat-error>
</mat-form-field>
</div>