如何在AngularJS中操作指令的样式?

时间:2013-10-08 11:08:04

标签: javascript html css angularjs angularjs-directive

我正在使用AngularJS和AngularJS指令编写组件。

我正在做这样的事情:

var MyApp = angular.module('MyApp', []);

MyApp.directive('myTag', function() {
    return { /* Some logic here*/ }
});

我希望能够更改我的组件的样式(使用CSS),如下所示:

<my-tag class="MyClass"></my-tag>

除此之外,我希望能够操纵我内部的所有元素风格 组件(my-tag内的HTML标记)。

您是否有任何建议或有用的示例如何使用AngularJS操纵自定义标签的样式属性?

10 个答案:

答案 0 :(得分:17)

这应该可以解决问题。

var MyApp = angular.module('MyApp', []);

MyApp.directive('myTag', function() {
    return { 
      link: function(scope, element, attributes){
        element.addClass('MyClass');
      }
    }
});

答案 1 :(得分:15)

这是AngularJS添加核心CSS样式的方式:

angular.element(document).find('head').prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}</style>');

您可以在angular.js v1.2.0-rc.2。

中找到此代码

修改

在自定义指令中,我使用此解决方案在指令中捆绑CSS样式表:

  var outputColorCSS = {
    selector: 'span.ouput-color',
    rules: [
        'display: inline-block',
        'height: 1em',
        'width: 5em',
        'background: transparent',
        'border: 3px solid black',
        'text-align: center',
        'font-weight: bold',
        'font-size: 0.8em'
    ]
  };
  var outputColorStyleSheet = outputColorCSS.selector + outputColorCSS.rules.join(';');
  angular.element(document).find('head').prepend('<style type="text/css">' + outputColorStyleSheet + '</style>');

然后您可以在指令模板中使用class="ouput-color"

我发现它很干净而且很有用。

答案 2 :(得分:13)

我参加派对有点晚了,但为什么你们都没有使用内置的.css()方法呢?

只需使用:

link: function(scope, elem, attr, ctrl)
{
    elem.css({'display': 'block', 'height': '100%', 'width': '100%'});

}

或者你想要的任何css。

答案 3 :(得分:7)

您可以使用参数将自定义样式放在指令的声明中,就像您举例说明的那样。

为了声明这样的样式,你必须定义一个变量来保存自定义样式:

scope: {
    myClass: '@myClass'
  },

然后在指令的模板中设置该参数,如下所示:

<my-tag my-class="CustomClass"></my-tag>

最后,在指令本身的模板中,引用该类:

<h1 class="{{myClass}}">{{myContent}}</h1>

我制作了一个plunker,展示了如何在指令check it out here 中自定义样式。

答案 4 :(得分:6)

Plunker

要通过属性指令操作css样式,可以执行以下操作:

var app = angular.module('colorSwap', []);

app.directive('styleChanger', function() {
  return {
    'scope': false,
    'link': function(scope, element, attrs) {
      var someFunc = function(data)
      {
        /* does some logic */
        return 'background-color:' + data;
      }
      var newStyle = attrs.styleChanger;
      scope.$watch(newStyle, function (style) {
        if (!style) {
          return ;
        }
        attrs.$set('style', someFunc(style));
      });
    }
  };
});

一些html:

<div ng-app="colorSwap">
  <input type="txt" ng-init="colorName= 'yellow'" ng-model="colorName" />
  <div style-changer="colorName">this is the div content</div>
</div>

要制作元素指令,请更改它自己的样式,如下所示:

app.directive('elementWithStyle', function() {
  return {
    'restrict' : 'E',
    'scope': {},
    'controller': function($scope) {
      $scope.someStyle = 'Cyan';
      $scope.someFunc = function() { $scope.someStyle = 'purple' };
    },
    'template': '<div style="background: {{someStyle}}" ng-click="someFunc()"> click me to change colors </div>'
  }
});

和html:

<div ng-app="colorSwap">
  <element-with-style>123</element-with-style>
</div>

我希望这会有所帮助。其余的答案或多或少地涵盖了阶级操纵。

答案 5 :(得分:3)

对于你指令的孩子内部的css操作,试试这个:

var MyApp = angular.module('MyApp', []);

MyApp.directive('myTag', function() {
    return { 
      link: function(scope, element, attr){

       // For your tag
       element.addClass('MyClass');

       // For elements inside your directive tag
       var tag_childs = element[0].childNodes;
       for(var i = 0; i < element[0].childElementCount; i++){

          tag_childs[i].style.height = '70px';

        }

      }
    }
});

答案 6 :(得分:2)

这是一个例子,请注意,这可能不是AngularJS的最佳用法,是声明性的,你可能只想把这些类放在标记上。但是,为了让您了解正在发生的事情,让我演示一个简单的指令来执行您最初的要求。

var MyApp = angular.module('MyApp', []);

MyApp.directive('myTag', function($compile) {
    return {
        restrict: 'E', // this means it will be an element
        link: function(scope, element, attrs, ctrl) {
            // First, I included the $compile service because it will be needed
            // to compile any markup you want to return to the element.

            // 1. Add the class, as you wanted
            element.addClass('MyClass');

            // 2. Add markup
            var html = '<div>Hello World</div>';
            //Compile it and add it back
            $compile(html)(scope);
            element.html(html);
        }
    };
});

最后,在您的标记上,您只需将其放入:

<my-tag />

答案 7 :(得分:1)

&#13;
&#13;
app.directive('bookslist', function() {

    return {
    	scope: true,
        templateUrl: 'templates/bookslist.html',
        restrict: "E",
        controller: function($scope){

        },
        link: function(scope, element, attributes){
        element.addClass('customClass');
      }

    }

});
&#13;
.customClass table{
	background: tan;

}
.customClass td{
	border: 1px solid #ddd;

}
&#13;
<!DOCTYPE html>
<html>

<head>
    <link href="app.css" rel="stylesheet">
    <script type="text/javascript" src="angular.min.js"></script>
    <script type="text/javascript" src="app.js"></script>
    <title>Task</title>
</head>

<body ng-app="app">
    <div ng-controller="myCtrl">
      
         <bookslist></bookslist>


    </div>
</body>

</html>
&#13;
&#13;
&#13;

答案 8 :(得分:1)

<强>角

app.directive("time",function(){
            var directive={};
            directive.restrict="A";
            directive.link=function(scope,element,attr,ctrl){                   
                element.css({
                    backgroundColor:'#ead333'
                });
            }
            var time=new Date().toTimeString();
            directive.template=time;
            return directive;
        });

<强> HTML

The times is <span time></span>

答案 9 :(得分:0)

我还没有找到完美的解决方案,但即使有指令,我也会关注John Papa's styling个控制器:

  • 该指令是一个文件夹(directiveName.directive)
  • 里面3个文件:directiveName.directive.js,directiveName.template.html,directiveName.styles.css
  • 在声明指令时使用templateUrl。模板像往常一样有css文件的链接

我发现它非常干净并遵循一种模式。不好的一面是你在渲染的HTML中的指令附近创建了几个<link>标签(尽管似乎不是一个问题)。查看this comment

话虽如此,请看Angular 1.5 component's。它相对较新,并且有更好的方法。现在我只将指令用于DOM操作(不能作为组件重用)。