在AngularJS中有条件地应用属性的最好方法是什么?

我需要能够添加例如“contenteditable”元素,基于范围上的布尔variables。

使用示例:

<h1 attrs="{'contenteditable=\"true\"': editMode}">{{content.title}}</h1> 

如果$scope.editMode设置为true会导致contenteditable = true被添加到元素。 是否有一些简单的方法来实现这个ng类的属性行为? 我正在考虑编写一个指令,如果不是,分享。

编辑:我可以看到,似乎有我的提议attrs指令和ng-bind-attrs之间的一些相似之处,但它在1.0.0.rc3中被删除 ,为什么呢?

当我不能使用ng-class的时候(例如当样式化SVG时),我使用下面的语句来有条件地设置类attr:

 ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}" 

同样的方法应该适用于其他属性types。

(我认为你需要使用最新的不稳定Angular来使用ng-attr-,我目前在1.1.4上)

你可以用ng-attr前缀属性来评估一个Angularexpression式。 当expression式的结果未定义时,将从属性中删除值。

 <a ng-attr-href="{{value || undefined}}">Hello World</a> 

会产生(当价值是假的时候)

 <a ng-attr-href="{{value || undefined}}" href>Hello World</a> 

所以不要使用false因为这会产生“false”这个词作为值。

 <a ng-attr-href="{{value || false}}" href="false">Hello World</a> 

在指令中使用这个技巧。 如果指令的属性缺less值,则该属性为false。

例如,上述将是错误的。

 function post($scope, $el, $attr) { var url = $attr['href'] || false; alert(url === false); } 

我通过硬设置属性得到了这个工作。 并使用该属性的布尔值来控制属性适用性。

这里是代码片段:

 <div contenteditable="{{ condition ? 'true' : 'false'}}"></div> 

我希望这有帮助。

在最新版本的Angular(1.1.5)中,它们包含了一个名为ngIf的条件指令。 它与ngShowngHide不同之处在于元素不被隐藏,但是根本不包含在DOM中。 它们对于创造成本昂贵但不被使用的组件非常有用:

 <h1 ng-if="editMode" contenteditable=true>{{content.title}}</h1> 

要获得一个属性来显示基于布尔检查的特定值,或者如果布尔检查失败,则完全省略,我使用了以下内容:

ng-attr-example="{{params.type == 'test' ? 'itWasTest' : undefined }}"

用法示例:

<div ng-attr-class="{{params.type == 'test' ? 'itWasTest' : undefined }}">

根据params.type的值输出<div class="itWasTest"><div>

<h1 ng-attr-contenteditable="{{isTrue || undefined }}">{{content.title}}</h1>

当isTrue = true时会产生: <h1 contenteditable="true">{{content.title}}</h1>

当isTrue = false时: <h1>{{content.title}}</h1>

我实际上是在几个月前写了一个补丁程序来做这件事(在freenode的#angularjs上有人问到这个问题后)。

它可能不会被合并,但是它非常类似于ngClass: https : //github.com/angular/angular.js/pull/4269

无论是否合并,现有的ng-attr- *内容可能都适合您的需求(如其他人所提到的),尽pipe它可能比您build议的更多的ngClass风格的function有点笨拙。

关于被接受的解决scheme,即Ashley Davis发布的解决scheme,所描述的方法仍然在DOM中打印属性,而不pipe其被分配的值是未定义的。

例如,在具有ng-model和value属性的input字段设置上:

 <input type="text" name="myInput" data-ng-attr-value="{{myValue}}" data-ng-model="myModel" /> 

不pipemyValue是什么, value属性仍然被打印在DOM中,因此被解释。 吴模式,然后,被覆盖。

有点不愉快,但使用ng-if的技巧:

 <input type="text" name="myInput" data-ng-if="value" data-ng-attr-value="{{myValue}}" data-ng-model="myModel" /> <input type="text" name="myInput" data-ng-if="!value" data-ng-model="myModel" /> 

我会build议在ng-if指令中使用更详细的检查:)

你也可以使用这样的expression式:

 <h1 ng-attr-contenteditable="{{ editMode ? true : false }}"></h1> 

对于input字段validation,您可以执行:

 <input ng-model="discount" type="number" ng-attr-max="{{discountType == '%' ? 100 : undefined}}"> 

只有在discountTypetypes定义为%才会将属性max应用于100