如何 CSS 样式 AngularJS 指令?

Posted

技术标签:

【中文标题】如何 CSS 样式 AngularJS 指令?【英文标题】:How to CSS style AngularJS directive? 【发布时间】:2013-11-03 19:34:06 【问题描述】:

假设我有一个指令“mydirect”,其模板包含大量 div 和大量嵌套类。例如:

<div class="mydirect">
  <div class="classA">
    <div class="subclassA">
      <div class="subclassB">
      </div>
    <div class="classB"></div>
</div>

我注意到尽管在 css 文件(“mydirectstyle.css”)中有类名并且它被包含在 index.html 中,但使用我的指令:

angular.module("MyApp", []).
  directive('mydirect', function() 
    return 
      restrict: 'E',
      replace: true,
      template: '-All that Html here-'
    ;
  );

没有任何 CSS 属性应用于它。将我的所有样式应用于这些多个类的最佳方法是什么?是否可以这样我就不必手动选择每个元素并设置单独的 CSS 属性?

我的 index.html 页面包含一个 &lt;mydirect&gt; &lt;/mydirect&gt;,它被上面显示的指令模板替换。

【问题讨论】:

css 属性应该应用在你的指令模板中。你能做一个显示问题的 plunker 或 jsfiddle 吗? 是的,如果没有看到你的 CSS,很难告诉你发生了什么 【参考方案1】:

使用实际元素名称在 DOM 中创建指令比尝试使用类方法要容易得多。有两个原因:1) &lt;mydirect&gt;&lt;div class="mydirect"&gt; 相比更具可读性;2) 只需使用正确的 css 语法,您就可以轻松地进行样式设置。

保持您的指令不变,除了将其更改为 restrict: 'EA'(here 的文档)和 replace: false,如下所示:

.directive('mydirect', function() 
    return 
        restrict: 'EA',
        replace: false,
        template: '-All that Html here-'
    ;
);

这里是你现在可以使用的选项以及如何配置相应的 CSS 以获得你想要的样式,如this jsbin 所示:

希望对您有所帮助。

【讨论】:

您使用模板启用了replace: true,因此您的组件元素将替换为&lt;p&gt; 标记(基于您的模板字符串)。因此hello-world... 的 CSS 不匹配,因此不会被应用。如果你设置replace: false,一切正常。 你是对的。为避免混淆,我更新了我的答案。希望对您有所帮助。【参考方案2】:

带有自定义 CSS 的 Angular 指令。

app.directive('bookslist', function() 

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

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

    

);
.customClass table
	!background: #ddd;


.customClass td
	border: 1px solid #ddd;

【讨论】:

一个好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅是为了 OP,而且是为了未来的 SO 访问者。 另外,sn-p 没有运行。【参考方案3】:

根据google下和Angular指令创建逻辑在下面示例的描述对象中,设置两个配置组件。首先,我们正在设置限制配置选项。限制选项用于指定如何在页面上调用指令。

正如我们之前看到的,有四种不同的方式来调用指令,因此有四个有效的限制选项:

'A' - <span ng-sparkline></span> 
'E' - <ng-sparkline></ng-sparkline> 
'C' - <span class="ng-sparkline"></span> 
'M' - <!-- directive: ng-sparkline -->

【讨论】:

【参考方案4】:

我认为解决方案很简单。但这只是一个猜测。 您可以使用以下命令定义指令:

<div class="mydirect></div>

在你的指令定义中你使用:

restrict: 'E'

Angularjs 不渲染该指令,因为 Angularjs 正在寻找类似的东西:

<mydirect></mydirect>

只需将restrict: 'E' 更改为restrict: 'C'

【讨论】:

我试过了。它不起作用。它必须与我的直接元素被指令模板替换时的事实有关,由于替换,没有任何 CSS 被应用。问题是如何处理? @Rolando 这里是一个例子,它似乎以你描述的方式工作;也许还有什么不对劲。但是请注意,指令类应用于模板本身,因此您的类可能不会在您期望的位置结束。 plnkr.co/edit/zQ5teYoQ7qeUbsM71b57 @Rolando 你怎么称呼你的指令?您需要在指令“mydirect”模板之外的某处有 。我认为问题不在于替换,而是 angularjs 没有找到要渲染的指令。

以上是关于如何 CSS 样式 AngularJS 指令?的主要内容,如果未能解决你的问题,请参考以下文章

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

Angularjs+Bootstrap实现分页指令

AngularJS 事件指令/input相关指令/样式指令/DOM操作指令详解

AngularJS----ngModelController

如何考虑样式化 AngularJS 组件?

如何在 Angular 指令的 Link 函数中设置 CSS 样式