【问题标题】:Angular2: binding to input radio name doesn't workAngular2:绑定到输入无线电名称不起作用
【发布时间】:2016-05-23 01:06:32
【问题描述】:

在 Angular2 中,单向绑定到一组无线电输入的名称属性不起作用。例如:

<div [ngFormModel]="form">
  <input type="radio" [name]="varName" [id]="id1" ngControl="r1">
  <input type="radio" [name]="varName" [id]="id2" ngControl="r2">
  <input type="radio" [name]="varName" [id]="id3" ngControl="r3">
</div>

加载页面时,名称不是任何这些无线电输入的属性。

【问题讨论】:

    标签: angular angular2-forms


    【解决方案1】:

    我猜@Schippie 写的是正确的。使用

    [attr.name]="name"
    

    而不是

    [name]="name"
    

    (他的 Plunker 有一些问题)

    Plunker example

    【讨论】:

    • 晚饭前我很抱歉,我也发现了。纠正了错误。对于刚开始使用 Angular 的人来说,令人困惑的一件事是,使用 [name]="variable" 在某些条件下适用于某些元素,但并非总是如此。所以总是使用[attr.name] 似乎更省钱。如果您希望它也显示在元素上
    • 这不一定是 Angular 问题。某些属性(如label 元素的htmlFor)与它们所反映的属性(for)的名称不同。 Angular 造成的原因是,有时某些指令应用于具有与属性同名的输入的元素,但如果不使用[attr.name],这些指令不会反映到属性中,但这是出于性能原因。更新属性代价高昂,因为它们会更改 DOM,甚至会导致重新渲染。
    • 我希望 Angular 能够提供 IDE 支持,以便能够查看指令是否最终被应用。为了能够提供出色的 IDE 支持,我们做出了许多设计决策。
    • 老实说,除了 Jetbrains 和 Webstorm 之外,我还在为未来提供大力支持。只是希望他们能快点修复 typescript 工具,因为它仍然无法与我目前使用的 Visual Studio 代码编辑器相提并论,因为它似乎是 100% 准确反映 tsc 的工具。
    【解决方案2】:

    如果这与绑定到 select 属性的方式类似,则 name 属性将设置在 javascript dom 元素上。这意味着虽然它没有显示在视图中,但它实际上已在 HTMLElement 上设置。

    用以下代码说明:

    import {Component} from '@angular/core'
    import {ControlGroup, Control} from '@angular/common'
    
    @Component({
      selector: 'my-app',
      providers: [],
      template: `
      <form [ngFormModel]="group">
          <input type="radio" [attr.name]="name" ngControl="test">
          <input type="radio" [attr.name]="name" ngControl="test2" ref-example>
          <input type="radio" [name]="name" ngControl="test3" ref-exampletwo>
          <p>using [attr.name]: {{example.name | json }}</p>
          <p>using [name]: {{exampletwo.name | json }}</p>
      </form>
      `
    })
    export class App {
      name: "test"
      group: ControlGroup
    
      constructor() {
        this.group = new ControlGroup({
          test: new Control(""),
          test2: new Control(""),
          test3: new Control("")
        })
      }
    }
    

    http://plnkr.co/edit/xHkgb0BgPzZLwyFpTo1W?p=preview

    你真正想做的是:

    [attr.name]="name"

    这将设置元素的属性。

    【讨论】:

    • FORM_DIRECTIVESFORM_PROVIDERS 全球可用,无需提供。 ...directivesproviders 中是多余的。为什么你注入FormBuilder,然后使用new ControlGroup(...)。只需使用 `formBuilder.group(...)´ 代替。
    • 您的答案已被删除,这就是我发布自己的答案的原因。我为使 Plunker 工作付出了一些努力,因此我不想删除它。
    • 关于表单指令/提供程序的好点是不知道通常我在引导程序和需要的指令中注入提供程序。很高兴知道。将修改代码以反映这一点。而表单构建器只是我在自己的代码中懒惰地复制构造函数。
    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 2014-06-27
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2016-08-14
    相关资源
    最近更新 更多