我正在使用带有以下自定义属性指令的第三方lib:
angular.directive('snapDrawer', function () {
'use strict';
return {
restrict: 'AE',
...
因此,如果在HTML元素中找到属性“snap-drawer”,则指令实现具有匹配并触发,例如:
<div snap-drawer></div>
我正在使用Angular 1.3,它对ng-attr采用“AllOrNothing”方法,如果条件值未定义,则属性不会像这样渲染:
<div ng-attr-snap-drawer="{{data.addSnapDrawer}}"></div>
100%这个有效,我的控制器中data.addSnapDrawer的值是未定义的,而snap-drawer attr不会在DOM中呈现
我已经确认Angular 1.3在这里使用ng-attr进行AllOrNothing方法:What is the best way to conditionally apply attributes in Angular?(看看Mathew Foscarini的回答)
但DOM中的渲染是:
<div ng-attr-snap-drawer="{{data.addSnapDrawer}}" class="snap-drawer snap-drawer-left" style=""></div>
所以,令人难以置信的是,angular.directive('snapDrawer')与“ng-attr-snap-drawer”相匹配。怎么可能呢,我真的很震惊AngularJS,尽管如此,还有这样的bug。
我在网上找不到任何东西。我不能设置snap-drawer =“false”我需要它不出现在DOM中,我通过从Angular 1.2升级到1.3来实现。
答案 0 :(得分:1)
这很老,但是我偶然发现了一个非常相似的东西。 https://developer.android.com/reference/android/content/BroadcastReceiver-有经验的作者采用这种方式。
您需要设计一种不同的方式(取决于您的用例)来有条件地应用指令(例如,使用ng-switch并具有两个版本的HTML;一个带有指令的版本,一个没有指令的版本,或者具有高优先级的终端指令)在链接阶段评估表达式,应用必要的指令并编译元素)。