我正试图根据其类有条件地将指令应用于元素。
以下是我的问题的简单案例see the results in this fiddle。对于此示例,我使用类名称地图为ng-class
和true
的布尔形式;在我的实际情况中,我想使用函数的布尔结果。
标记:
<div ng-app="example">
<div class="testcase">
This will have the directive applied as I expect
</div>
<div ng-class="{'testcase':true}">
This will not have the directive applied but I expect it to
</div>
</div>
JS:
angular.module('example', [])
.directive('testcase', function() {
return {
restrict: 'C',
link: function(scope, element, attrs) {
element.css('color', 'red');
}
}
}
);
为什么指令不适用于通过div
获取课程的ng-class
?我是否误解了AngularJS处理指令的顺序?
我应该如何根据表达式的评估有条件地将指令应用于元素?
答案 0 :(得分:24)
ng-class
只需在DOM上设置类,在编译过程之后。
应用指令的更好方法可能是通过HTML属性:
<div test-case>
当然,这不是有条件的,但我会将条件留给指令:
<div ng-app="example" ng-controller="exampleCtrl">
<div test-case condition="dynamicCondition">Hello</div>
<input type="checkbox" ng-model="dynamicCondition"/> Condition
</div>
和
angular.module('example', [])
.controller('exampleCtrl', function ($scope) {
$scope.dynamicCondition = false;
})
.directive('testCase', function () {
return {
restrict: 'A',
scope: {
'condition': '='
},
link: function (scope, element, attrs) {
scope.$watch('condition', function(condition){
if(condition){
element.css('color', 'red');
}
else{
element.css('color', 'black');
};
});
}
}
});
请注意,指令名称为testCase
而不是testcase
,scope: {'condition': '='},
位确保条件属性已同步,并且可用scope.condition
和watch
每次第一个表达式更改值时,都会计算第二个参数。 JsFiddle over here。
也许你也应该研究ng-switch
:
<div ng-switch="conditionFunction()">
<div ng-when="true" test-case>Contents when conditionFunction() returns true</div>
<div ng-when="false">Contents when conditionFunction() returns false</div>
</div>
答案 1 :(得分:1)
angular.module('example', [])
.directive('testCase', function() {
return {
restrict: 'C',
link: function(scope, element, attrs) {
element.css('color', 'red');
}
}
})
答案 2 :(得分:0)
根据我的说法,不要使用基于ng-class设置的类的条件指令,就像这个问题一样。
请勿使用此
<div ng-app="example">
<div class="testcase">
This will have the directive applied as I expect
</div>
<div ng-class="{'testcase':true}">
This will not have the directive applied but I expect it to
</div>
</div>
因为在复杂情况下处理起来非常复杂,所以请始终在自定义指令中使用条件。
使用此
link: function (scope, element, attrs) {
scope.$watch('condition', function(condition){
if(condition){
// something going here
}
else{
// something going here
};
});
}