如何在 Angular 2 中添加条件属性?

IT技术 javascript angular
2021-01-18 07:16:48

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

以前版本的 Angular 有NgAttr并且我认为NgChecked它们似乎都提供了我所追求的功能。但是,这些属性在 Angular 2 中似乎不存在,我认为没有其他方法可以提供此功能。

6个回答

null 删除它:

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

或者

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

暗示:

属性 vs 属性

如果添加此绑定的 HTML 元素没有绑定中使用的名称的属性(checked在这种情况下),并且没有 Angular 组件或指令应用于具有 的同一元素@Input() checked;,则[xxx]="..."不能使用。

另请参见HTML 中的属性和属性之间有什么区别?

没有这样的属性时绑定什么

替代方案是[style.xxx]="..."[attr.xxx]="..."[class.xxx]="..."取决于您尝试完成的任务。

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

属性只能处理字符串值

一个常见的缺陷还在于,对于[attr.xxx]="..."绑定,值 ( ...)始终字符串化的。只有属性和@Input()s 可以接收其他值类型,如布尔值、数字、对象、...

元素的大多数属性和属性都是相连的并且具有相同的名称。

属性-属性连接

当绑定到属性时,该属性也只从属性接收字符串化的值。
当绑定到属性时,属性会收到绑定到它的值(布尔值、数字、对象等),而属性又是字符串化的值。

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

从那时起,Angular 发生了变化,并且知道这些特殊情况并处理它们,以便<label [for]="即使不存在此类属性也可以绑定(对于colspan

您可以省略“attr”。字首。
2021-03-15 07:16:48
@FilipStachowiak 那么它就不会成为一个属性。许多元素都有各种属性,其中元素本身将绑定到属性的值反映到属性(以及另一个方向)。在这种情况下,您不需要attr.. 但是如果要添加自定义属性,肯定需要attr.前缀
2021-03-16 07:16:48
@dudewad 这对我来说听起来不正确。如果href在具有该href属性的元素上设置,则无需使用attr. 一定是有什么地方出了问题。
2021-03-16 07:16:48
@günter-zöchbauer 好吧,我使用的是 Ng 4.x,<a [href]="item.href">其中item.href未定义的位置(不是未定义的值,但该属性href不存在于item)正在将href属性设置null. 我没有深入研究来源,因为老实说我现在不太在意(这是一个很小的细节),但是attr.完全不同的指令,因此它的行为不同对我来说并不奇怪。
2021-03-21 07:16:48
需要说明是,您需要attr.部分内容。我试图设置[href]并且只希望在项目的href属性存在时设置它如果没有[attr.href]这个,将会添加一个值为“null”的 href,点击后会刷新当前页面。[attr.href]解决它。
2021-04-04 07:16:48

在 angular-2 属性语法中是

<div [attr.role]="myAriaRole">

将属性角色绑定到表达式 myAriaRole 的结果。

所以可以使用像

[attr.role]="myAriaRole ? true: null"
谢谢,但我问如何有条件地添加属性,而不是有条件地分配它的值。
2021-03-14 07:16:48
@FilipStachowiak 那么它就不会成为一个属性。许多元素都有各种属性,其中元素本身将绑定到属性的值反映到属性(以及另一个方向)。在这种情况下,您不需要attr.. 但是如果要添加自定义属性,肯定需要attr.前缀
2021-03-24 07:16:48
您甚至可以省略“attr”。字首。
2021-04-01 07:16:48
哦,天哪,这个:null 太棒了,知道这可以在条件下使用!感谢您的解决方案。
2021-04-02 07:16:48
这里的问题是,当your expressionfalse在DOM属性的样子<div checked="false">我认为这不是预期的效果。
2021-04-10 07:16:48

精炼 Günter Zöchbauer 回答:

这现在似乎不同了。我试图这样做是为了有条件地将 href 属性应用于锚标记。对于“不适用”的情况,您必须使用 undefined。作为示例,我将使用一个有条件地应用了 href 属性的链接进行演示。

--EDIT--看起来 angular 已经改变了一些东西,所以null现在可以按预期工作了。我已经更新了示例以使用null而不是undefined.

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

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

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

我认为这比在跨度和锚标记上使用两个 *ngIf 更干净。它也非常适合向按钮添加禁用属性。

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

同样对于样式属性... <h4 [style.color]="'red'">Some text</h4>

你可以用这个。

<span [attr.checked]="val? true : false"> </span>

您使用“val”检查了您的属性值。如果为真,则返回真值,否则返回假值
2021-04-11 07:16:48