我如何有条件地添加一个元素属性,例如复选框的复选?

以前版本的Angular有NgAttr和NgChecked,它们似乎都提供了我想要的功能。然而,这些属性在Angular 2中似乎不存在,而且我也找不到其他方法来提供这个功能。


当前回答

Null删除它:

[attr.checked]="value ? '' : null"

or

[attr.checked]="value ? 'checked' : null"

提示:

属性与属性

当你添加这个绑定的HTML元素没有绑定中使用的属性名(在这种情况下勾选),并且没有Angular组件或指令应用到选中@Input()的同一个元素,那么[xxx]="…"不能被使用。

参见HTML中的属性和属性之间的区别是什么?

如果没有这样的属性,还绑定什么呢

其他选项有[style.xxx]="…",[attr.xxx]="…",[class.xxx]="…",这取决于你想要完成什么。

因为<input>只有一个checked属性,而没有checked属性[attr.checked]="…"对于这种特定的情况是正确的方式。

属性只能处理字符串值

一个常见的陷阱是,对于[attr.xxx]="…"绑定,值(…)总是被字符串化。只有属性和@Input()s可以接收其他值类型,如boolean, number, object,…

元素的大多数属性和属性是相互关联的,并且具有相同的名称。

Property-attribute连接

当绑定到属性时,属性也只接收来自属性的字符串化值。 当绑定到属性时,属性接收绑定到它的值(布尔值,数字,对象,…),属性再次接收字符串化的值。

属性和属性名不匹配的两种情况。

在angular 2.0模板中添加for属性时出错 https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/htmlFor(请参阅描述的第一句话htmlFor属性反映了for的值- for可能不起作用,因为它是C或JavaScript中的关键字) 为什么colspan在Angular 2中不是已知的原生属性?

Angular从那时起就改变了,它知道这些特殊情况并处理它们,这样你就可以绑定到<label [for]=",即使不存在这样的属性(colspan也一样)。

其他回答

金特柴尔德解答

现在情况似乎有所不同。我试图这样做,有条件地应用一个href属性到一个锚标记。你必须使用undefined来表示“不适用”的情况。作为示例,我将演示一个有条件地应用href属性的链接。

——编辑 看起来angular改变了一些东西,所以null现在可以正常工作了。我将示例更新为使用null而不是undefined。

根据超链接规范,没有href属性的锚标记将变成纯文本,表示链接的占位符。

对于我的导航,我有一个链接列表,但其中一个链接代表当前页面。我不希望当前页面链接是一个链接,但仍然希望它出现在列表中(它有一些自定义样式,但这个例子是简化的)。

<a [attr.href]="currentUrl !== link.url ? link.url : null">

我认为这比在span和anchor标签上使用两个*ngIf更简洁。它还非常适合为按钮添加禁用属性。

Null删除它:

[attr.checked]="value ? '' : null"

or

[attr.checked]="value ? 'checked' : null"

提示:

属性与属性

当你添加这个绑定的HTML元素没有绑定中使用的属性名(在这种情况下勾选),并且没有Angular组件或指令应用到选中@Input()的同一个元素,那么[xxx]="…"不能被使用。

参见HTML中的属性和属性之间的区别是什么?

如果没有这样的属性,还绑定什么呢

其他选项有[style.xxx]="…",[attr.xxx]="…",[class.xxx]="…",这取决于你想要完成什么。

因为<input>只有一个checked属性,而没有checked属性[attr.checked]="…"对于这种特定的情况是正确的方式。

属性只能处理字符串值

一个常见的陷阱是,对于[attr.xxx]="…"绑定,值(…)总是被字符串化。只有属性和@Input()s可以接收其他值类型,如boolean, number, object,…

元素的大多数属性和属性是相互关联的,并且具有相同的名称。

Property-attribute连接

当绑定到属性时,属性也只接收来自属性的字符串化值。 当绑定到属性时,属性接收绑定到它的值(布尔值,数字,对象,…),属性再次接收字符串化的值。

属性和属性名不匹配的两种情况。

在angular 2.0模板中添加for属性时出错 https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement/htmlFor(请参阅描述的第一句话htmlFor属性反映了for的值- for可能不起作用,因为它是C或JavaScript中的关键字) 为什么colspan在Angular 2中不是已知的原生属性?

Angular从那时起就改变了,它知道这些特殊情况并处理它们,这样你就可以绑定到<label [for]=",即使不存在这样的属性(colspan也一样)。

如果你需要精确检查,最好使用property而不是attribute,并为它分配一些布尔值:

<input type="checkbox" [checked]="smth">

如果你想有条件地添加任意属性,你可以使用binding对它:

<p [attr.data-smth]="smth">

如果该值为undefined或未添加null属性。 如果值为空字符串,则添加属性时不带值。 否则,属性将使用字符串化值添加。

当然,您可以将它与attr一起使用。检查:

<input type="checkbox" [attr.checked]="smth ? '' : null">

但请注意,在这种情况下,attr与被检查是不同步的,所以下面的组合

<input type="checkbox" [checked]="false" [attr.checked]="''">

将导致属性为选中的未选中复选框。

一个完整的例子:

import { Component } from "@angular/core";

@Component({
  selector: "app-root",
  template: `
    <p [attr.data-smth]="e">The value is: {{what(e)}}</p>
    <p [attr.data-smth]="s">The value is: {{what(s)}}</p>
    <p [attr.data-smth]="u">The value is: {{what(u)}}</p>
    <p [attr.data-smth]="n">The value is: {{what(n)}}</p>
    <p [attr.data-smth]="t">The value is: {{what(t)}}</p>
    <p [attr.data-smth]="f">The value is: {{what(f)}}</p>

    <input type="checkbox" [checked]="t">
    <input type="checkbox" [checked]="f">

    <input type="checkbox" [attr.checked]="t ? '' : null">
    <input type="checkbox" [attr.checked]="f ? '' : null">

    <input type="checkbox" [checked]="false" [attr.checked]="''">
  `,
  styles: [`
    p[data-smth] {
      color: blue;
    }
  `]
})
export class AppComponent {
  e = ""
  s = "abc"
  u = undefined
  n = null
  t = true
  f = false

  what(x) {
    return typeof x === 'string' ? JSON.stringify(x) : x + ""
  }
}

这就是结果:

标记:

如果它是一个输入元素,您可以编写类似....的内容 <input type="radio" [checked]="condition"> condition必须为true或false。

还有样式属性… < h4(风格。color] = "红”< / h4 > >一些文本

对于为已经存在的scss编写HTML的人,可以使用更好的方法。 超文本标记语言

[attr.role]="<boolean>"

scss

[role = "true"] { ... }

这样你就不需要<boolean> ?True:每次都为空。