【问题标题】:How to deal with css and custom directive in angulajs如何处理angularjs中的css和自定义指令
【发布时间】:2015-11-09 04:20:21
【问题描述】:

考虑 angularjs 中的自定义指令:

.directive('myDir', function() {
  return {
    restrict: 'E',
    template: "..."
  }
})

据我所知,标签<my-dir></myDir> 没有关联的默认样式(或者,至少,它不是块标签)。现在我想设置它的样式并将其放置在页面的正确位置。我有 2 个选择:

1) 使用此模板:

.directive('myDir', function() {
  return {
    restrict: 'E',
    template: "<div class="layout">...</div>",
  }
})

还有css:

.layout {
    /* bla bla bla */
}

但这在 DOM 3 中引入了一个新的不必要的级别,因为如果我写了类似 &lt;my-dir class="layout"&gt;&lt;/my-dir&gt; 的内容并附加了正确的 css,它无论如何都会起作用,但我必须记住每次添加相同的 css 类在我的代码中使用&lt;my-dir&gt;(这不是DRY)。

2) 这导致我在 post-link 函数中添加样式:

.directive('myDir', function() {
  return {
    restrict: 'E',
    template: "...",
    link: function(scope, element, attrs) {
      element.addClass('layout');
    }
  }
})

哪种策略更好?有我看不到的优点或缺点吗?

更新:

在指令定义中使用replace: true 不是一种选择,因为它已被弃用,并且在使用引导程序时,&lt;my-dir class="visible-xs"&gt;&lt;/my-dir&gt; 之类的东西可能很有用。

【问题讨论】:

    标签: javascript html css angularjs


    【解决方案1】:

    您可以通过在指令中添加 replace: true 选项来解决此问题,这基本上会将您的指令 DOM 替换为您从指令中提供的模板。

    指令

    .directive('myDir', function() {
      return {
        restrict: 'E',
        template: "<div class="layout">...</div>",
        replace: true //added replace true property
      }
    })
    

    生成的 HTML

    <div class="layout">..Content..</div>
    

    就像我上面展示的那样,你可以通过简单地使用指令的replace 选项来摆脱不必要的 HTML 标签。

    Demo Plunkr

    注意

    根据 Angular Docs replace 选项已在 Angular2 中被弃用, 但在你的情况下,你可以避免这种情况。

    但是,如果您真的想避免使用指令的replace 选项,那么我建议您将指令用作属性而不是使用element,但是您需要使用&lt;div class="layout"&gt;外面然后你可以把你的指令放在上面,比如&lt;div class="layout" my-dir&gt;。但是,如果您再次从 Angular2 的角度考虑它,您正在使用 attribute/class

    将组件结构更改为旧的角度方式

    【讨论】:

    • @Sirion 哦,谢谢分享..但仍在思考为什么它在我的 plunkr 有的角度 1.4.7 中工作..尝试将其更改为 replace: falsereplace: true 它真正工作. .你注意到了吗? 1.4.61.5.0-beta.1 版本中的事件似乎有效..
    • @Sirion 你读过replace ([DEPRECATED!], will be removed in next major release - i.e. v2.0)吗?
    • 是的,但如果他们指出这意味着我们不应该使用它(恕我直言)。
    • @Sirion AFAIK 当您从 Angular 1.X 迁移到 Angular 2 时,您需要完全重写。不要认为在声明任何组件时会有像 replace 这样的选项。在 Angular 提出替代方法之前,我会使用该属性..
    猜你喜欢
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2015-06-21
    • 1970-01-01
    相关资源
    最近更新 更多