129

我正在使用ReactiveFormsModuleAngular2 创建一个包含表单的组件。这是我的代码:

foo.component.ts

constructor(fb: FormBuilder) {
    this.myForm = fb.group({
        'fullname': ['', Validators.required],
        'gender': []
    });
}

foo.component.html(带[formControl]):

<div class="fields">
    <div class="field">
        <label>Fullname*</label>
        <input type="text" [formControl]="myForm.controls.fullname"/>
    </div>
</div>

<div class="inline fields">
    <label for="gender">Gender</label>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" checked="" tabindex="0" class="hidden" [formControl]="myForm.controls.gender">
            <label>Male</label>
        </div>
    </div>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" tabindex="0" class="hidden" [formControl]="myForm.controls.gender">
            <label>Female</label>
        </div>
    </div>
</div>

foo.component.html(带formControlName):

<div class="fields">
    <div class="field">
        <label>Fullname*</label>
        <input type="text" formControlName="fullname"/>
    </div>
</div>

<div class="inline fields">
    <label for="gender">Gender</label>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" checked="" tabindex="0" class="hidden" formControlName="gender">
            <label>Male</label>
        </div>
    </div>
    <div class="field">
        <div class="ui radio checkbox">
            <input type="radio" name="gender" tabindex="0" class="hidden" formControlName="gender">
            <label>Female</label>
        </div>
    </div>
</div>

两种方式都有效。但我无法弄清楚使用[formControl]和之间有什么区别formControlName

4

5 回答 5

231

我相信您错过了重要的一点:[formGroup]第二个示例中的指令。formControlName与 一起使用[formGroup]来保存您的表单多点导航。例如:

<div>
  <input type="text" [formControl]="myForm.controls.firstName"/>
  <input type="text" [formControl]="myForm.controls.lastName"/>
  <input type="text" [formControl]="myForm.controls.email"/>
  <input type="text" [formControl]="myForm.controls.title"/>
</div>

相当于:

<div [formGroup]="myForm">
  <input type="text" formControlName="firstName"/>
  <input type="text" formControlName="lastName"/>
  <input type="text" formControlName="email"/>
  <input type="text" formControlName="title"/>
</div>

现在想象嵌套FormGroups:)

于 2016-10-21T08:38:22.913 回答
24

[formControl]FormControl将对您创建的实例的引用分配给FormControlDirective.

formControlName为表单模块分配一个字符串,以按名称查找控件。

如果您为控件创建变量,您也不需要.Harry 提到的,但我也建议使用[formGroup],因为更复杂的表单可能会变得混乱。

constructor(fb: FormBuilder) {
    this.fullName = new FormControl('', Validators.required);
    this.gender = new FormControl('');
    this.myForm = fb.group({
        'fullname': this.fullName,
        'gender': this.gender
    });
}
于 2016-10-21T08:42:27.647 回答
8

接受的答案中提供的两者有第三个等效项,即(不推荐):

<div [formGroup]="myForm">
  <input type="text" [formControl]="firstName"/>
  <input type="text" [formControl]="lastName"/>
  <input type="text" [formControl]="email"/>
  <input type="text" [formControl]="title"/>
</div>

请注意,我们仍在使用 [formGroup] 指令。

然而,为了使这个模板编译没有错误,你的组件需要将控件声明为 AbstractControls 而不是 FormControls:

我的组件.ts

firstName: AbstractControl
lastName: AbstractControl
email: AbstractControl
title: AbstractControl

但是,请注意不建议声明 AbstractControls ,因此如果您收到错误Cannot find control with unspecified name attribute,则可能是您混合了样式或将您的控件声明为 AbstractControls。

于 2018-02-27T14:05:09.847 回答
4

来自 Angular 文档(https://angular.io/guide/reactive-forms):

零件

@Component({
  ...
})
export class ProfileEditorComponent {
  profileForm = new FormGroup({
    firstName: new FormControl(''),
    lastName: new FormControl(''),
  });
}

模板

<form [formGroup]="profileForm">

  <label>
    First Name:
    <input type="text" formControlName="firstName">
  </label>

  <label>
    Last Name:
    <input type="text" formControlName="lastName">
  </label>

</form>

请注意,正如FormGroup包含一组控件一样,profileForm通过指令FormGroup绑定到表单元素,FormGroup 在模型和包含输入的表单之间创建了一个通信层。该指令formControlName提供的输入 FormControlName将每个单独的输入绑定到在FormGroup

于 2018-08-10T03:18:14.440 回答
0

你可以使用[formControl]反应式编程的优势,因为FormControl有一个名为valueChanges(我现在知道这个,也许还有更多)的属性,它返回一个Observable你可以订阅和使用它的属性。(例如,在您希望检查输入电子邮件在用户更改值时不重复的注册场景中非常有用)

于 2018-02-13T20:59:21.263 回答