Angular在指令中应用类

时间:2015-07-19 14:44:58

标签: javascript angularjs angularjs-directive dom-manipulation angularjs-ng-class

我有一个angular指令,它将生成bootstrap form-group,查找$ scope.errors以获取指令的ng-model值以显示错误。示例如下: 我的HTML代码:

<input type="text" b-input ng-model="data.company.name" label="Company Name" class="form-control"/>

和我的指令代码:

app.directive('bInput', function ($compile) {
    return {
        restrict: 'EA',
        replace: true,
        link: function (scope, element, attrs) {
            var div = $('<div>', {
                'class': 'form-group',
                'ng-class': " 'has-error' : errors." + attrs.ngModel + " != null "
            });

            $compile(div)(scope);
            element.wrap(div);
            if (attrs.label != undefined) {
                element.before('<label for="' + attrs.name + '" class="control-label">' + attrs.label + '</label>');
                element.removeAttr('label');
            }
        }
    };
});

你能解释一下我如何达到预期的效果吗?

1 个答案:

答案 0 :(得分:2)

修改指令的compile fn中的元素,因为在DOM处是明确的。然后在链接函数内重新编译该元素,该函数从编译函数返回。

<强>代码

app.directive('bInput', function($compile) {
  return {
    restrict: 'EA',
    replace: true,
    compile: function(element, attrs) {
      var div = $('<div>', {
        'class': 'form-control',
        'ng-class': " 'has-error' : errors." + attrs.ngModel + " != null "
      });
      element.wrap(div);
      if (attrs.label != undefined) {
        element.before('<label for="' + attrs.name + '" class="control-label">' + attrs.label + '</label>');
        element.removeAttr('label');
      }
      element.removeAttr('b-input');
      return function(scope, element, attrs) {
        var linkFn = $compile(element);
        linkFn(scope)
      }
    };
  });

查看类似的SO answer here