这有点棘手。但我就是这样做的。
自定义组件。组成部分ts
const isParentControlRequired = function (control: FormControl) {
if (control.validator !== null) {
const validator = control.validator({}as AbstractControl);
return validator && validator.required;
}
return false;
};
export class someComponent {
....
@Input()
get required() {
return this._required;
}
set required(req) {
this._required = coerceBooleanProperty(req);
this._updateValidators();
//Emit stateChange to update value in mat-groupCtrl-field
this.stateChanges.next();
}
@Input()
get disabled() {
return this._disabled;
}
set disabled(dis) {
this._disabled = coerceBooleanProperty(dis);
this._disabled ? this.parts.disable() : this.parts.enable();
this._updateValidators();
//Emit stateChange to update value in mat-groupCtrl-field
this.stateChanges.next();
}
@Input() formControlName: string;
private _containerControl: FormControl;
constructor(private _elRef: ElementRef,
private _formBuilder: FormBuilder,
private _focusMonitor: FocusMonitor,
@Optional() @Host() @SkipSelf()
private controlContainer: ControlContainer) {
this.parts = _formBuilder.group({
"pwd": ["", this._baseValidators],
"pwdRepeat": ["", this._baseValidators],
},
{validator: valuesMatchValidation(["pwd", "pwdRepeat"])}
);
_focusMonitor.monitor(_elRef.nativeElement, true)
.subscribe(origin => {
this.focused = !!origin;
this.stateChanges.next();
});
}
ngOnInit(): void {
if (!!this.formControlName && this.controlContainer) {
this._containerControl = <FormControl>this.controlContainer.control.get(this.formControlName);
this.required = isParentControlRequired(this._containerControl);
}
ngDoCheck(): void {
if (!!this._containerControl) {
let parentCtrlDisabled = this._containerControl.disabled;
if (this.disabled !== parentCtrlDisabled) {
this.disabled = parentCtrlDisabled;
}
let parentCtrlRequired = isParentControlRequired(this._containerControl) && !parentCtrlDisabled;
if (this.required !== parentCtrlRequired) {
this.required = parentCtrlRequired;
}
}
}