Angular 角度反应窗体:在多个formGroup中共享formControl时失去父级
当不同的Angular 角度反应窗体:在多个formGroup中共享formControl时失去父级,angular,angular-reactive-forms,Angular,Angular Reactive Forms,当不同的formGroups持有相同的formControl时,如果formControl发生更改,则只会通知其中一个 formControl有一个parentattr,但没有parent,当它添加到formGroup时,angular将替换它的parentattr constparent1=newformgroup({}); const partent2=新的FormGroup({}); const control=new FormControl(); parent1.addControl('
formGroups
持有相同的formControl
时,如果formControl
发生更改,则只会通知其中一个
formControl
有一个parent
attr,但没有parent
,当它添加到formGroup
时,angular将替换它的parent
attr
constparent1=newformgroup({});
const partent2=新的FormGroup({});
const control=new FormControl();
parent1.addControl('key1',control);
parent2.addControl('key2',control);
parent1.valueChanges.subscribe((数据)=>console.log('parent1 change');
parent2.valueChanges.subscribe((数据)=>console.log('parent2 change');
控件。设置值('v');
//只有父母1改变
我需要一种在不同的formGroups
中共享formControl
的方法。手动复制formControl
非常累人。(复制初始值、复制验证器、订阅值更改)。
有没有更好的方法来共享
formControl
?是的,AbstractControl
有一个属性parent:FormGroup | FormArray
。因此控件只能有一个父控件
通过以下方式通知家长:
updateValueAndValidity(opts: {onlySelf?: boolean, emitEvent?: boolean} = {}): void {
this._setInitialStatus();
this._updateValue();
if (this.enabled) {
this._cancelExistingSubscription();
(this as{errors: ValidationErrors | null}).errors = this._runValidator();
(this as{status: string}).status = this._calculateStatus();
if (this.status === VALID || this.status === PENDING) {
this._runAsyncValidator(opts.emitEvent);
}
}
if (opts.emitEvent !== false) {
(this.valueChanges as EventEmitter<any>).emit(this.value);
(this.statusChanges as EventEmitter<string>).emit(this.status);
}
if (this._parent && !opts.onlySelf) {//<------------------------
this._parent.updateValueAndValidity(opts);
}
}
updateValueAndValidity(选项:{onlySelf?:boolean,emitEvent?:boolean}={}):void{
这是。_setInitialStatus();
这个。_updateValue();
如果(此.enabled){
这是。_取消现有订阅();
(这是{errors:ValidationErrors | null})。errors=this。_runValidator();
(这是{status:string})。status=this。_calculateStatus();
if(this.status==VALID | | this.status==PENDING){
此.\u runAsyncValidator(opts.emitEvent);
}
}
如果(opts.emitEvent!==false){
(this.value更改为EventEmitter).emit(this.value);
(this.status更改为EventEmitter).emit(this.status);
}
如果(此家长仅选择自己){//