【问题标题】:input text field inside radio button group在单选按钮组内输入文本字段
【发布时间】:2018-03-09 23:16:14
【问题描述】:

有没有办法将ngModel 绑定到radio group 内的input 文本字段?我有一个多选单选按钮组,最后一个选项为other(带有输入文本)。这是我目前所拥有的:

 <mat-radio-group fxLayout="column" name="goal_name" [(ngModel)]="goal.name">
          <mat-radio-button *ngFor="let gn of goalNames" name="goal_name" [value]="gn">{{gn}}</mat-radio-button>
          <mat-radio-button value="" name="goal_name">
            <mat-form-field>
              <input matInput placeholder="Other" [(ngModel)]="goal.name" name="something">
            </mat-form-field>
          </mat-radio-button>
        </mat-radio-group>

goalNames = ["buy", "travel", "save",
    "build", "retire"];

这个实现的问题是ngmodel 的值没有将自己绑定到单选按钮的值。这就是为什么每次输入文本更改时收音机都会取消选中。有没有办法实现这个要求?

【问题讨论】:

  • 即使没有选择“其他”选项,如果输入框中出现所选的名称,是否会打扰您?例如,如果用户选择“旅行”,您会在输入框中看到“旅行”。
  • 拥有other 字段背后的整个想法是没有任何上述选项。

标签: javascript angular angular-material angular-material2


【解决方案1】:

This stackblitz 展示了一种方法。使用了两个属性:goalOption 绑定到选定的单选按钮值,customGoalName 绑定到输入文本。当两者中的任何一个发生变化时,goal.name 会通过在属性设置器中调用 updateGoalName 来更新。

private _goalOption: string = "";
private _customGoalName: string = "";

goal = { name: "" };

goalNames = ["buy", "travel", "save", "build", "retire"];

get goalOption(): string {
  return this._goalOption;
}
set goalOption(value: string) {
  this._goalOption = value;
  this.updateGoalName();
}

get customGoalName(): string {
  return this._customGoalName;
}
set customGoalName(value: string) {
  this._customGoalName = value;
  this.updateGoalName();
}

private updateGoalName(): void {
  this.goal.name = this._goalOption === "other" ? this._customGoalName : this._goalOption;
}

自定义目标名称的单选按钮在模板中具有值 other。输入事件 ngModelChange 的处理程序确保在用户键入自定义目标名称时选中 other 单选按钮。

<mat-radio-group fxLayout="column" name="goal_name" [(ngModel)]="goalOption">
  <mat-radio-button *ngFor="let gn of goalNames" name="goal_name" [value]="gn">{{gn}}</mat-radio-button>
  <mat-radio-button value="other" name="goal_name">
    <mat-form-field>
      <input matInput placeholder="Other" [(ngModel)]="customGoalName" (ngModelChange)="goalOption = 'other'" name="something">
    </mat-form-field>
  </mat-radio-button>
</mat-radio-group>

【讨论】:

  • 有没有办法禁用other单选选项的默认选择?
  • 用当前的代码,只需要默认设置标准选项之一即可。
  • 还有一个烦恼:如果您键入的文本以标准选项之一开头,则会自动选择该选项。那不是很好。我认为最好的实现是为输入框中输入的名称设置一个单独的变量。
  • 如果我们将other移出广播组,是否有解决方案?
  • 我更新了我的答案和 stackblitz 以展示它如何与两个变量一起工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 2021-02-16
  • 2011-05-18
  • 2012-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
相关资源
最近更新 更多