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

Ken*_*nne 288 angularjs angularjs-directive

我需要能够根据范围内的布尔变量向元素添加"contenteditable".

使用示例:

<h1 attrs="{'contenteditable=\"true\"': editMode}">{{content.title}}</h1>
Run Code Online (Sandbox Code Playgroud)

如果$scope.editMode设置为,则会导致将contenteditable = true添加到元素中true.有没有一些简单的方法来实现这样的ng-class属性行为?我正在考虑写一个指令并分享,如果没有.

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

Ash*_*vis 268

当使用ng-class时,我使用以下条件有条件地设置类attr(例如在设置SVG样式时):

ng-attr-class="{{someBoolean && 'class-when-true' || 'class-when-false' }}"
Run Code Online (Sandbox Code Playgroud)

相同的方法应该适用于其他属性类型.

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

  • 这种方法的问题在于无论结果如何都会创建属性.理想情况下,我们想要控制或不完全创建属性. (128认同)
  • 只是为了澄清这个答案:如果你用*ng-attr -`作为*any*属性的前缀,那么编译器将去除前缀,并添加属性**,其**值绑定到**角度表达式的结果**来自原始属性值. (97认同)
  • 请注意,ng-attr-stuff已从Angular 1.2中删除.这个问题不再有效. (23认同)
  • 在我看来,如果使用三元运算符,则更容易阅读,在1.1.5中添加了支持.那看起来像:{{someConditionalExpression?'class-when-true':'class-when-false'}} (12认同)
  • 你错了.该项目https://github.com/codecapers/AngularJS-FlowChart使用Angular 1.2和ng-attr-.最新的文档(Angular 1.4)仍然包括ng-attr- (2认同)
  • ng-attr 并没有真正被删除。它只是被重构了。新实现的开始在这里:https://github.com/angular/angular.js/commit/cf17c6af475eace31cf52944afd8e10d3afcf6c0 (2认同)

Rea*_*lar 116

您可以在属性前添加ng-attreval一个Angular表达式.当表达式的结果未定义时,将从属性中删除该值.

<a ng-attr-href="{{value || undefined}}">Hello World</a>
Run Code Online (Sandbox Code Playgroud)

会产生(当价值为假时)

<a ng-attr-href="{{value || undefined}}" href>Hello World</a>
Run Code Online (Sandbox Code Playgroud)

所以不要使用,false因为这会产生单词"false"作为值.

<a ng-attr-href="{{value || false}}" href="false">Hello World</a>
Run Code Online (Sandbox Code Playgroud)

在指令中使用此技巧时.如果指令缺少值,则该指令的属性将为false.

例如,上述内容将是错误的.

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

  • @RomanK嗨,手册说'undefined`是一个特例.*"当使用ngAttr时,使用$ interpolate的allOrNothing标志,因此如果插值字符串中的任何表达式导致未定义,则该属性将被删除而不会添加到元素中."* (13认同)
  • 只是为了帮助任何未来的读者,"Angular 1.3"中似乎添加了"未定义"行为.我使用的是1.2.27,目前必须使用IE8. (9认同)
  • 我喜欢这个答案.但是,我不认为如果值未定义,它将隐藏属性.不过,我可能会遗漏一些东西.所以第一个结果是<a ng-attr-href="{{value || undefined}}" href> Hello World </a> (3认同)
  • 要确认更多Angular 1.2.15将显示href,即使值未定义,看起来未定义的行为在Angular 1.3中开始,如上面的注释所述. (3认同)

jsb*_*sht 96

我通过硬设置属性来完成这项工作.并使用属性的布尔值控制属性适用性.

这是代码片段:

<div contenteditable="{{ condition ? 'true' : 'false'}}"></div>
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.


Bri*_*sio 22

在最新版本的Angular(1.1.5)中,它们包含了一个名为的条件指令ngIf.它不同于ngShowngHide在的元素是不能隐藏,但在DOM完全不包含.它们对于创建成本高但不使用的组件非常有用:

<h1 ng-if="editMode" contenteditable=true>{{content.title}}</h1>
Run Code Online (Sandbox Code Playgroud)

  • 我相信ng-if仅适用于元素级别,也就是说,您不能仅为元素的一个属性指定条件. (32认同)
  • 但请注意,"ng-if"会创建一个新的范围. (5认同)
  • 确实,但你可以做`<h1 ng-if ="editMode"contenteditable ="true"> <h1 ng-if ="!editMode">` (3认同)

Gle*_*len 14

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

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

用法示例:

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

会输出<div class="itWasTest">还是<div>基于价值params.type


小智 9

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

将在isTrue = true时生成: <h1 contenteditable="true">{{content.title}}</h1>

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

  • 如果我想要一些像<h1 contenteditable ="row">这样的东西怎么办? (5认同)

小智 6

关于已接受的解决方案,Ashley Davis发布的解决方案,所描述的方法仍然在DOM中打印属性,而不管其分配的值是否未定义.

例如,在具有ng-model和value属性的输入字段设置中:

<input type="text" name="myInput" data-ng-attr-value="{{myValue}}" data-ng-model="myModel" />
Run Code Online (Sandbox Code Playgroud)

无论myValue背后是什么,value属性仍然会在DOM中打印出来,因此会被解释.然后,Ng模型被覆盖.

有点不愉快,但使用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" />
Run Code Online (Sandbox Code Playgroud)

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


Kam*_*cek 6

你也可以使用这样的表达式:

<h1 ng-attr-contenteditable="{{ editMode ? true : false }}"></h1>
Run Code Online (Sandbox Code Playgroud)


chr*_*lsa 5

几个月前我(实际上是有人在freenode上的#angularjs中询问了这个问题)后,我写了一个补丁.

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

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