我用的是Angular 2和D3.js.我想展示一个红色的长方形.

只有在style.css文件中输入样式时,它才有效.

当我将我的样式放入组件101时,它不起作用.this plunkr元支票

当我使用组件styles: []时,如何让它工作?谢谢

UPDATE:@micronyks提供了一个解决方案,但它使组件中的样式成为全局的,与在style.css文件中写入基本上没有区别.在this plunkr中,它显示一个组件中的样式将覆盖另一个组件的样式,因此无法显示绿色和红色矩形.

UPDATE 2:@Günter的方法完美地解决了这个问题!!以甘特的方式提醒一下:它至少需要Angular beta 10.(我的其他Plunkr使用Angular beta 8)使用Angular beta 12的绿色和一个红色矩形的工作演示是here.

import {Component} from 'angular2/core'
@Component({
  selector: 'my-app',
  providers: [],
   styles: [`
    /*this does not work*/
    .bar {
      fill: red;
    }
  `],
  template: `
    <div>
      <svg class="chart"></svg>
    </div>
  `,
  directives: []
})
export class App {
  constructor() {}

  ngOnInit() {
    this.draw();
  }

  draw() {
    let data = [{name: 'A', value: 1}];
    let width = 400, height = 200;

    let x = d3.scale.ordinal().rangeRoundBands([0, width]);
    let y = d3.scale.linear().range([height, 0]);

    let chart = d3.select(".chart")
      .attr("width", width)
      .attr("height", height)
      .append("g");

    x.domain(data.map(function(d) { return d.name; }));
    y.domain([0, d3.max(data, function(d) { return d.value; })]);

    chart.selectAll(".bar")
      .data(data)
      .enter().append("rect")
      .attr("class", "bar")
      .attr("x", function(d) { return x(d.name); })
      .attr("y", function(d) { return y(d.value); })
      .attr("height", function(d) { return height - y(d.value); })
      .attr("width", x.rangeBand());
  }
}

推荐答案

使现代化

Angular和SASS不久前同意支持::ng-deep(而不是>>>/deep/),直到::slotted或任何使其成为浏览器标准的东西在所有浏览器中都可用.

ViewEncapsulation.Emulated (default)

这是故意的.Angular会添加组件特有的类名,并重写添加的样式,使其仅适用于添加这些样式的组件.

D3在没有Angulars知识的情况下动态生成HTML,Angular无法应用类使样式应用于生成的HTML.

如果在入口点HTML文件中添加样式,Angular也不会重写样式,添加的助手类也不会生效.

ViewEncapsulation.None

使用encapsulation: ViewEncapsulation.None Angular不会进行这种重写,因此结果类似于将HTML添加到index.html.

"Shadow-piercing"

或者,您可以使用最近推出的阴影穿透CSS组合器>>>/deep/::shadow(::shadow 取代,因此非常有限).另见https://stackoverflow.com/a/36225709/217408Plunker

:host /deep/ div {
  color: red;
}

SASS

/deep/适用于SASS,但别名>>>不适用.

shadow piersing CSS组合符由Angular重写,不需要浏览器支持.Chrome支持它们有一段时间了,但它们被弃用了——但正如所说的,这并不重要,因为Angular会重写它们以使用其封装模拟.

ViewEncapsulation.Native

Angular不支持从外部设置此类组件的样式.只有当浏览器提供CSS变量等支持时,才能使用这些变量.

Typescript相关问答推荐

判断对象A中存在的对象B的键是否存在对象A中键的另一个数组值中

Typescript对每个属性具有约束的通用类型

如何使打包和拆包功能通用?

使用React处理Websocket数据

输入元素是类型变体的对象数组的正确方法是什么?'

为什么TypeScript假设文档对象始终可用?

material 表不渲染任何数据

无法从Chrome清除还原的初始状态数据

AngularJS服务不会解析传入的Json响应到管道中的模型

如何在typescript中为this关键字设置上下文

专用路由组件不能从挂钩推断类型

如何在脚本中输入具有不同数量的泛型类型变量的函数?

类型脚本-在调用期间解析函数参数类型

如何在不违反挂钩规则的情况下动态更改显示内容(带有状态)?

有没有一种更好的方法来存储内存中的数据,而不是在类型脚本中使用数组和基于索引的函数?

如何处理可能为空的变量...我知道这不是Null?

如何使对象同时具有隐式和显式类型

参数未映射泛型返回类型

基于参数的 TS 返回类型

TS 条件类型无法识别条件参数