angular - 通过验证将表单分成多个组件

标签 angular typescript angular-forms

我想创建一个 Angular 为 2 的大表单。但我想创建这个包含多个组件的表单,如下例所示。

应用组件

<form novalidate #form1="ngForm" [formGroup]="myForm">
<div>
    <address></address>
</div>
<div>
    <input type="text" ngModel required/>
</div>

<input type="submit" [disabled]="!form1.form.valid" > </form>

地址组件

<div>
<input type="text" ngModel required/> </div>

当我使用上面的代码时,它在我需要的浏览器中可见,但是当我删除地址组件中的文本时,提交按钮没有被禁用。
但是当我删除应用程序组件中输入框中的文本时,该按钮被正确禁用。

最佳答案

我会使用一种效果很好的响应式(Reactive)形式,关于您的评论:

Is there any other simple example for this one? Maybe the same example without loops

我可以举个例子。您需要做的就是嵌套一个 FormGroup 并将其传递给 child 。

假设您的表单看起来像这样,并且您想将 address 表单组传递给 child :

ngOnInit() {
  this.myForm = this.fb.group({
    name: [''],
    address: this.fb.group({ // create nested formgroup to pass to child
      street: [''],
      zip: ['']
    })
  })
}

然后在你的父级中,传递嵌套的表单组:

<address [address]="myForm.get('address')"></address>

在您的 child 中,使用 @Input 作为嵌套表单组:

@Input() address: FormGroup;

并在您的模板中使用 [formGroup]:

<div [formGroup]="address">
  <input formControlName="street">
  <input formControlName="zip">
</div>

如果你不想创建一个实际的嵌套表单组,你不需要这样做,你可以将父表单传递给子表单,所以如果你的表单看起来像:

this.myForm = this.fb.group({
  name: [''],
  street: [''],
  zip: ['']
})

您可以传递任何您想要的控件。使用与上面相同的示例,我们只想显示 streetzip,子组件保持不变,但模板中的子标签将如下所示:

<address [address]="myForm"></address>

这是一个

Demo 第一个选项,这里是第二个 Demo

更多信息 here关于嵌套模型驱动表单。

关于angular - 通过验证将表单分成多个组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43270564/

相关文章:

javascript - 如何将星号位置从右更改为左 Angular Material 2?

javascript - 在 Angular 2 中访问 DOM 属性

javascript - 在 Typescript 上使用带有本地参数的 toLocaleLowerCase 方法

angular - 无法使用具有选择值的 patchValue 绑定(bind)到对象

angular - 使用自定义类中的 Angular MatDialog(不包含在 app.module.ts 中)

typescript - 为什么 http.post 没有在 Angular 2 中调用我的 Controller

javascript - 在 Angular 中显示 ContentFul RichText

javascript - 更改表单控件 Angular 中的数据

Angular Form Group 重新初始化

javascript - 在 ngfor 中交换数据后获取新数组