Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 嵌套的被动形式始终有效_Angular_Angular Reactive Forms - Fatal编程技术网

Angular 嵌套的被动形式始终有效

Angular 嵌套的被动形式始终有效,angular,angular-reactive-forms,Angular,Angular Reactive Forms,我使用嵌套的反应式表单作为表单控件 这是演示 问题:即使嵌套无效,主窗体仍然有效(请尝试清除必填字段) 如何向主窗体通知嵌套窗体的有效性更改 主要表单组件: import { Component, Input } from '@angular/core'; import { FormBuilder, FormGroup, ControlContainer, NgForm, Validators } from '@angular/forms'; @Component({ selector:

我使用嵌套的反应式表单作为表单控件

这是演示

问题:即使嵌套无效,主窗体仍然有效(请尝试清除必填字段)

如何向主窗体通知嵌套窗体的有效性更改

主要表单组件:

import { Component, Input } from '@angular/core';
import { FormBuilder, FormGroup, ControlContainer, NgForm, Validators } from '@angular/forms';

@Component({
  selector: 'my-app',
  template: `
    <h1>Form</h1>
    <pre>Valid: {{ form.valid }}</pre>
    <form [formGroup]="form" (ngSubmit)="onSubmit(form.value)" novalidate>
      <label>name</label>
      <input formControlName="name">
      <app-address-form formControlName="address"></app-address-form>
      <button>submit</button>
    </form>
    <ng-container *ngIf="submitData">
      <span>submit data</span>
      <pre>{{ submitData }}</pre>
    </ng-container>
  `
})
export class AppComponent  {
  @Input() name: string;
  submitData = '';
  form: FormGroup;

  constructor(private fb: FormBuilder) {
    this.form = fb.group({
      name: fb.control('foo bar', Validators.required),
      address: fb.control({
        city: 'baz',
        town: 'qux',
      })
    });
  }

  onSubmit(v: any) {
    this.submitData = JSON.stringify(v, null, 2);
  }
}
<app-address-form (formValidStatus)="formValidStatus($event)" formControlName="address"></app-address-form>
从'@angular/core'导入{Component,Input};
从'@angular/forms'导入{FormBuilder、FormGroup、ControlContainer、NgForm、Validators};
@组成部分({
选择器:“我的应用程序”,
模板:`
类型
有效:{form.Valid}
名称
提交
提交数据
{{submitData}}
`
})
导出类AppComponent{
@Input()名称:string;
提交数据=“”;
表格:表格组;
构造函数(私有fb:FormBuilder){
this.form=fb.group({
名称:fb.control('foo-bar',需要验证器),
地址:fb.control({
城市:“巴兹”,
城市:“库克斯”,
})
});
}
onSubmit(v:任何){
this.submitData=JSON.stringify(v,null,2);
}
}
嵌套表单组件:

import { Component, Input } from '@angular/core';
import { FormBuilder, FormGroup, ControlContainer, NgForm, Validators } from '@angular/forms';

@Component({
  selector: 'my-app',
  template: `
    <h1>Form</h1>
    <pre>Valid: {{ form.valid }}</pre>
    <form [formGroup]="form" (ngSubmit)="onSubmit(form.value)" novalidate>
      <label>name</label>
      <input formControlName="name">
      <app-address-form formControlName="address"></app-address-form>
      <button>submit</button>
    </form>
    <ng-container *ngIf="submitData">
      <span>submit data</span>
      <pre>{{ submitData }}</pre>
    </ng-container>
  `
})
export class AppComponent  {
  @Input() name: string;
  submitData = '';
  form: FormGroup;

  constructor(private fb: FormBuilder) {
    this.form = fb.group({
      name: fb.control('foo bar', Validators.required),
      address: fb.control({
        city: 'baz',
        town: 'qux',
      })
    });
  }

  onSubmit(v: any) {
    this.submitData = JSON.stringify(v, null, 2);
  }
}
<app-address-form (formValidStatus)="formValidStatus($event)" formControlName="address"></app-address-form>
从'@angular/core'导入{Component,forwardRef};
从'@angular/forms'导入{ControlContainer,ControlValueAccessor,FormGroup,FormControl,NG_VALUE_ACCESSOR,NgControl,NgForm,Validators};
// https://docs.google.com/presentation/d/e/2PACX-1vTS20UdnMGqA3ecrv7ww_7CDKQM8VgdH2tbHl94aXgEsYQ2cyjq62ydU3e3ZF_BaQ64kMyQa0INe2oI/pub?slide=id.g293d7d2b9d_1_1532
@组成部分({
选择器:“应用程序地址表单”,
模板:`
城市
镇
`,
供应商:[
{
提供:NG_值访问器,
多:是的,
useExisting:forwardRef(()=>AddressFormComponent)
}
]
})
导出类AddressFormComponent实现ControlValueAccessor{
form:FormGroup=新FormGroup({
城市:新的FormControl(“”,需要验证器),
城镇:新表单控制(“”,验证器。必填)
});
onTouched:()=>void=()=>{};
writeValue(v:any){
setValue(v,{emitEvent:false});
}
注册变更(fn:(v:any)=>无效){
本.表格.价值变更.认购(fn);
}
setDisabledState(已禁用:布尔值){
禁用?this.form.disable():this.form.enable();
}
注册表(fn:()=>无效){
this.ontoched=fn;
}
}
方法1:(使用事件发射器)

方法2:

constructor(private appc: AppComponent){} 

this.appc.methodname();
constructor(private fb: FormBuilder) {
    this.form = fb.group({
      name: fb.control('foo bar', Validators.required),
      address: fb.control({
        city: 'baz',
        town: 'qux',
      })
    });
  }
使用Angular DI在子组件构造函数中注入ParentComponent。您可以在子组件中调用父方法

 constructor(private fb: FormBuilder) {
    this.form = fb.group({
      name: fb.control('foo bar', Validators.required),
      address: fb.group({
        city: ['box',Validators.required],
        town: ['qux',Validators.required],
      })
    });
  }

将地址控件更改为formGroup,并在其中添加验证

因此,它应该是:


发射事件\u从子发射器发射到父发射器。您可以使用setValidators()更新父窗体验证程序。请提供更多详细信息。下面提供了答案。主窗体不会知道嵌套组件中动态添加的控件。到目前为止还不错。但还是有一个错误。错误:control.registerOnChange不是一个函数
 constructor(private fb: FormBuilder) {
    this.form = fb.group({
      name: fb.control('foo bar', Validators.required),
      address: fb.group({
        city: ['box',Validators.required],
        town: ['qux',Validators.required],
      })
    });
  }