【问题标题】:Angular2 Reactive Forms formControl for radio buttons单选按钮的Angular2 Reactive Forms formControl
【发布时间】:2017-02-18 18:36:01
【问题描述】:

我正在使用反应式表单在 Angular 中构建一个表单。我正在使用 FormBuilder 来制作一组字段。对于文本框,这非常有效。但我找不到单选按钮的 formControl。

这是如何工作的?我应该像使用文本输入一样使用<input formControlName="gender" type="radio">吗?

【问题讨论】:

    标签: angular angular-reactive-forms angular-forms


    【解决方案1】:

    我应该像处理文本输入一样使用<input formControlName="gender" type="radio"> 吗?

    是的。

    这是如何工作的?

    表单控制指令使用ControlValueAccessor 指令与本机元素进行通信。每个可能的输入都有不同类型的ControlValueAccessors。正确的一个由值访问器指令的selector 选择。选择器基于 type<input> 是什么。当您拥有type="radio" 时,将使用无线电的值访问器。

    【讨论】:

    • 我试过了,但我想我之前犯了一个错误......谢谢!
    • 我尝试使用 。值不绑定到单选按钮,但用于文本框工作。()
    【解决方案2】:

    在您的组件中,将您的单选按钮定义为表单的一部分:

    export class MyComponent {
      form: FormGroup;
      constructor(fb: FormBuilder){
        this.form = fb.group({
          gender: ""
        });
      }
    }
    

    在你的 HTML 组件中,构造你的表单:

    <div class="form-group">
      <label>Please select your gender</label>
      <div class="row">
        <label class="md-check">
          <input type="radio" value="female" name="gender" formControlName="gender">
          Female
        </label>
    
        <label class="md-check">
          <input type="radio" value="male" name="gender" formControlName="gender">     
          Male
        </label>
      </div>
    </div>
    

    我假设您知道如何使用提交按钮构建整个表单,此处未显示。

    表单提交时,可以在这里获取单选按钮的值:

    let genderValue = this.form.value.gender;
    

    这将是“女性”或“男性”,具体取决于选中的单选按钮。

    希望这对您有所帮助。祝你好运!

    【讨论】:

    • 我认为有必要指出名称和 formControlName 必须相同,正如您在代码中所使用的那样 - 对于两个收音机。有些人可能会错过的一个微妙点。
    • 2 个其他有用的点 - (1) 如果你愿意,你仍然可以包含一个(更改)事件,尽管无论如何你都会订阅更改,所以不确定这是否有意义。 (2) 在您的代码中,您不能像使用 [(ngModel)] 时那样绑定值,如 [value]="" - 所以请记住删除值周围的 [],如 @Chang 在此处显示的那样
    • name 属性是可选的!
    • 不要与其他答案冲突,但在我自己的测试中,我发现在 fb.group 函数中设置默认值时,您确实需要在值周围加上“[]”模板。
    • 我们如何验证是否选择了一个选项?
    【解决方案3】:

    关于我注意到的响应式表单的一点补充。如果该值是整数,则需要将其更改为字符串,否则将不会选择单选按钮..

      this.jobForm = this._fb.group({
                        id: [res["job"]["id"]],
                        job_status: [res["job"]["job_status"]**["id"].toString()**,Validators.required],
                        title: [res["job"]["title"],Validators.required]
                    });
    

    【讨论】:

    • 您可以通过使用 [] 像这样 [value]="0" 而不是 value="0".
    【解决方案4】:

    Angular Material controls(大部分)已经足够成熟,现在可以使用了。

    他们的示例大多使用 ngModel,但这里是使用 formControlName 的方法。

    <mat-radio-group formControlName="colorFilter" fxLayout="column" fxLayoutGap=".25rem">
        <mat-radio-button [value]="'Blue'">Blue things</mat-radio-button>
        <mat-radio-button [value]="'Red'">Red things</mat-radio-button>
        <mat-radio-button [value]="'Orange'">Orange things</mat-radio-button>
    </mat-radio-group>
    

    我正在使用angular/flex-layout 将我的按钮放在垂直列中。

    (也可以使用value='Blue' 来表示常量或使用[value]="blueColorName" 来引用模型属性。

    我认为0 可能存在问题,因为它不是“真实”值,因此请注意您是否绑定到枚举(可能不再是问题)。

    【讨论】:

      【解决方案5】:
        <form [formGroup]="form" >
          <div class="row" style="margin-left: 20px; margin-bottom: 13px;">
            <label class="colmn radio" style="font-size: 17px;text-transform: capitalize;">
              <input type="radio" value="false" name="filter" formControlName="filter">
                  Daily
              <span class="checkmark"></span>
            </label>
      
            <label class="colmn radio" style="font-size: 17px;text-transform: capitalize;margin-left: 56px">
              <input type="radio" value="true" name="filter" [checked]="true" formControlName="filter">     
                  Monthly
              <span class="checkmark"></span>
            </label>
      
          </div>
        </form>
      
      
      
        form: FormGroup;
      
        constructor(    private _fb: FormBuilder,
         ) {
      
          this.form = _fb.group({
            filter: false
          });
      
          this.__filterChangeSubscription =  this.form.get('filter').valueChanges.subscribe(
            filterValue => {
              console.log(filterValue)
            }
          )
        }
      

      【讨论】:

        【解决方案6】:

        Angular Reactive 表单适用于收音机,就像它适用于输入文本框一样。找到下面的 HTML 代码和组件使用电子邮件文本框和单选按钮来选择用户。

        注意点: formControlName 必须与父 formGroup 指令一起使用。所以你的formcontrol需要绑定到formgroup里面

        export class AppComponent  {
        
              form: FormGroup;
              someError = '';
        
              ngOnInit() {
                this.form = new FormGroup({
                  'username': new FormControl(''),
                  'password': new FormControl(''),
                  'radiotest': new FormControl('')
                });
              }
              reset() {
                this.form.reset();
                this.someError = '';
              }
            }
        

        HTML代码:

        <form [formGroup]="form">
            <label for="email">username</label>
            <input type="email" class="form-control" formControlName = "username">
            <input type="radio" formControlName="user" value="vimal"/>Vimal
            <input type="radio" formControlName="user" value="babu"/>Babu
        </form>
        <button (click)="reset()">Reset</button>
        <h3> {{ someError }} </h3>
        <h3> {{ form.value | json }} </h3>
        

        【讨论】:

          猜你喜欢
          • 2020-12-30
          • 2018-02-07
          • 2020-12-26
          • 2021-10-23
          • 2017-12-22
          • 2019-02-22
          • 2020-06-11
          • 2017-09-05
          • 2015-10-31
          相关资源
          最近更新 更多