在Angular2中为组件加载多个样式表

时间:2016-11-23 11:18:39

标签: css twitter-bootstrap angular webpack styles

我正在构建一个angular2应用程序。当我尝试为同一个组件加载多个样式表时,我遇到了多个问题。这是我正在做的代码:

import { Component } from '@angular/core';

@Component({
selector: 'my-tag',
templateUrl: 'my-tag.component.html',
styleUrls: [
    './style1.css',
    './style2.css'
    ]
})
export class MyTagComponent{}

现在我的问题出现了:

当我尝试从其他目录中包含css文件时:

styleUrls: [
    './style1.css',
    '../public/style2.css'
]

我收到错误

Uncaught Error: Expected 'styles' to be an array of strings.

在浏览器控制台中。

然后我在组件的目录中包含了第二个样式表style2.css并编写了第一个代码段。现在正在加载样式,但它正在全局加载。第二个样式表具有与引导程序冲突的类名,而不是bootstrap的样式,第二个样式表的样式正在全局应用,即其他组件'模板正在从第二个样式表设置样式。

styleUrls中列出的网址是否应该只应用于该组件而不会损害其他组件?

任何人都可以告诉我如何在不全局应用的情况下为特定组件加载多个css文件。

我还尝试了以下变通方法,但样式正在应用于我制作的所有组件。

styles: [
      require('./style1.css').toString(),
      require('../public/style2.css').toString()
 ]

P.S。我使用webpack作为我项目的模块捆绑器。

webpack.config(节选)

 {
    test: /\.css$/,
    exclude: helpers.root('src', 'app'),
    loader: ExtractTextPlugin.extract('style', 'css?sourceMap')
  },
  {
    test: /\.css$/,
    include: helpers.root('src', 'app'),
    loader: 'raw'
  }

3 个答案:

答案 0 :(得分:11)

我见过这种方法:

@Component({
    selector: 'app',
    templateUrl: './app.component.html',
    styleUrls: ['./app.component.css']
})
export class AppComponent {
}

app.component.css中有多个导入,因此:

@import url('/assets/plugins/bootstrap-datepicker/css/bootstrap-datepicker.css');
@import url('/assets/plugins/bootstrap-datepicker/css/bootstrap-datepicker3.css');
@import url('/assets/plugins/ionRangeSlider/css/ion.rangeSlider.css');
@import url('/assets/plugins/ionRangeSlider/css/ion.rangeSlider.skinNice.css');

我希望这会有所帮助。

答案 1 :(得分:1)

我们通过分别设置templateUrl和styleUrls元数据属性来包含模板和CSS文件。因为这些文件与组件位于同一位置,所以最好通过名称引用它们,而不必指定返回应用程序根目录的路径。

我们可以更改Angular计算完整URL的方式,将组件元数据的moduleId属性设置为 module.id

@Component({
  selector: 'my-tag',
  moduleId: module.id,
  templateUrl: 'my-tag.component.html',
  styleUrls:  ['style1.css', 'style2.css']
})
export class MyTagComponent { }

<强>更新#1

for webpack:

尝试在webpack config中使用'to-string-loader'作为css。

{ test: /\.css$/, loaders: ['to-string-loader', 'css-loader'] }

希望对你有用。

答案 2 :(得分:0)

相信问题在于您传递给ExtractPlugin.extract(loader:options | object)的'style'参数。我认为它引用了这个加载器:https://github.com/webpack/style-loader,它为DOM添加了一个样式标记,因此将全局应用你的样式。

我前几天遇到了这个问题,并且只是为了这篇文章而查找了上述理由,并且应该回过头来正确地解决它,但是我通过简单地使用css-loader来解决它这样:

  {
    test: /\.css$/,
    loader: "css-loader"
  }

以及将封装设置为ViewEncapsulation.Native,并且如前所述,在加载的CSS上调用.toString()。我想仍然可以使用ExtractTextPlugin而不删除'style'加载器。