【问题标题】:Angular 2, Material 2 Radio, FormgroupsAngular 2、Material 2 Radio、Formgroups
【发布时间】:2017-02-21 09:48:12
【问题描述】:

我正在尝试让 Angular 2 和 Material 2 与 FormGroup<md-radio> 组件一起工作。但是,当我像使用标准 <md-input> 那样连接它时,如果抛出错误。例如

component.html

<form [formGroup]="myFormGroup (ngSubmit)="doSomething()">          
<md-input #birthday formControlName="birthday" placeholder="Birthday"></md-input>
<md-radio-group formControlName="gender" align="end">
    <md-radio-button value="m">Male</md-radio-button>
    <md-radio-button value="f">Female</md-radio-button>
</md-radio-group>
</form>

component.ts

export class Component {

    myFormGroup: FormGroup;

    constructor(formBuilder: FormBuilder) {
        this.myFormGroup = formBuilder.group({
            birthday: [this.myModel.birthday, Validators.required],
            gender: [this.myModel.gender, Validators.required]
        });
    }
}

这给我的错误信息是:

ngModel 不能用于向父级注册表单控件 formGroup 指令。尝试使用 formGroup 的合作伙伴指令“formControlName”。示例:

<div [formGroup]="myGroup">
  <input formControlName="firstName">
</div>

In your class:

this.myGroup = new FormGroup({
   firstName: new FormControl()
});

  Or, if you'd like to avoid registering this form control, indicate that it's standalone in ngModelOptions:

  Example:


<div [formGroup]="myGroup">
   <input formControlName="firstName">
   <input [(ngModel)]="showMoreControls" [ngModelOptions]="{standalone: true}">
</div>

即使我将表单组更改为:

this.myFormGroup = formBuilder.group({
                birthday: [this.myModel.birthday, Validators.required],
                gender: new FormControl()
            });

我仍然收到同样的错误。

如何在 Angular 2 中将材质 2 &lt;md-radio&gt; 组件与 FormGroup 一起使用?任何帮助,将不胜感激。

非常感谢。

JT

【问题讨论】:

  • 你实际上是在混合两种不同的方法,看看这个 YouTube 视频,来自 Angular Material 团队的 Kara Erickson 解释了所有关于表单 youtu.be/xYv9lsrV0s4... 话虽这么说,我'我遇到了类似的问题,@dries247 的回答并没有为我解决。

标签: angular angular-material2


【解决方案1】:

我最近遇到了这个问题,我使用“值”访问使其工作。 如果值等于 radio-button-value,它会设置默认值。 使用您的代码:

import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import { Component } from '@angular/core';
myFormGroup: FormGroup;

export class Component {

   constructor(private formBuilder: FormBuilder) {
       this.myFormGroup = formBuilder.group({
           'birthday': ['', Validators.required],
           'gender': ['m', Validators.required]
       });
   }
}

对于模板:

<form [formGroup]="myFormGroup" (ngSubmit)="doSomething()">          
<md-input #birthday formControlName="birthday" placeholder="Birthday"></md-input>
<md-radio-group formControlName="gender" align="end">
    <md-radio-button value="m">Male</md-radio-button>
    <md-radio-button value="f">Female</md-radio-button>
</md-radio-group>
 <button 
        [disabled]="!myFormGroup.valid"
        md-raised-button 
        >Valid
      </button>
</form>

如果你想通过点击来执行一个函数,有一个EventEmitter,每次点击都会启动。

<md-radio-group formControlName="gender (change)="genderChanged($event.value)"

而且你只需要在TS中实现这个功能。

还有一种方法可以访问表单的值,只需通过

console.log("data from form:', this.myFormGroup.value);

希望这能稍微回答您的问题,这是第一次回答某人。 :D

【讨论】:

  • 您的解决方案效果很好。最常见的错误之一是将formControlName 放在收音机而不是收音机组中。
猜你喜欢
  • 2016-10-27
  • 2016-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-02
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多