如何根据ng-class设置的类应用AngularJS指令?

时间:2013-09-03 18:09:34

标签: angularjs angularjs-directive

我正试图根据其类有条件地将指令应用于元素。

以下是我的问题的简单案例see the results in this fiddle。对于此示例,我使用类名称地图为ng-classtrue的布尔形式;在我的实际情况中,我想使用函数的布尔结果。

标记:

<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处理指令的顺序?

我应该如何根据表达式的评估有条件地将指令应用于元素?

3 个答案:

答案 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而不是testcasescope: {'condition': '='},位确保条件属性已同步,并且可用scope.conditionwatch每次第一个表达式更改值时,都会计算第二个参数。 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
        };
    });
}