将样式传递给组件的最佳方法

bor*_*net 29 angular

所以我调用了这个组件InputEdit(基本上是一个Label可以在你点击时编辑的......很简单),这个组件有自己的阴影DOM CSS样式.但是当然每个托管组件都想为输入组件设置自己的字体大小和颜色......

那么最好的方法是什么?你能直接传入一个样式类并将整个CSS应用到组件中吗?或者最好手动传递每个值,如下所示:

     <InputEdit [color]="'red'"/>
Run Code Online (Sandbox Code Playgroud)

这似乎有很多工作,但是由于我们使用阴影或模拟DOM,我们不能只在外部控制CSS.

我也知道你可以通过以下方式拼接打开阴影并定位直接元素:

/* styles.css */
UserInfo /deep/ InputEdit label {
    color: red;
    font-size: 1.1em;
}
Run Code Online (Sandbox Code Playgroud)

这将基本上允许您进入名为UserInfo/deep(任何级别)/自定义组件的自定义组件InputEdit和目标标签,颜色为红色...

但同样,我想知道什么是专门针对ng2的最佳方法,比如将类配置传递给指令呢?

Mar*_*cok 23

我只想styles在InputEdit上使用input属性,并传入一个具有所需样式的对象:

<InputEdit [styles]="stylesObj">                 // in host component's template

stylesObj = {font-size: '1.1em', color: 'red'};  // in host component class

<input [ngStyle]="stylesObj" ...>                // in InputEdit component's template
Run Code Online (Sandbox Code Playgroud)

如果要设置多个DOM元素,请传入更复杂的对象:

<InputEdit [styles]="stylesObj">

stylesObj = {
  input: {font-size: '1.1em', color: 'red'}
  label: { ... } 
};

<label [ngStyle]="styles.label" ...>
<input [ngStyle]="styles.input" ...>
Run Code Online (Sandbox Code Playgroud)

  • 请记住将 CSS 属性放在一个字符串中,如果它由多个单词组成,则使用驼峰命名法。 (2认同)

bit*_*ess 9

马克·拉杰科克(Mark Rajcok)的答案对于一组样式来说是不错的选择,但是如果您只允许更改字体大小和颜色,则可能要使用一种更直接的方法(在本例中,也是仅用于像素,而不是用于演示目的的更灵活的字符串):

对于个人风格:

零件:
<InputEdit [color]="'red'" [fontSize]="16">

component.ts:
Input() color: string = 'black';
Input() fontSize: number = 18;

component.template:
<input type="text" [style.color]="color" [style.fontSize.px]="fontSize">


如果允许一组样式:

组件:
<InputEdit [styles]="{backgroundColor: 'blue', 'font-size': '16px'}">注意:如果有多个单词,请确保CSS属性为驼峰式字符串形式。

component.ts:
@Input() styles: any = {};

component.template:
<input type="text" [ngStyle]="styles">


Gün*_*uer 5

更新

::slotted 现在所有新浏览器都支持它,并且可以与`ViewEncapsulation.ShadowDom一起使用

https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted

原版的

/deep/,::shadow并且>>>已弃用. ::ng-deep是最好的选择,直到所有浏览器都正确支持样式封装并且ViewEncapsulation.Emulated可以删除.

弃用仅适用于Chrome中的本机实现(其他浏览器从未实现过),但Angular在ViewEncapsulation.Emulated(默认)中有自己的这些CSS组合器仿真

/deep/,::shadow>>>::ng-deep因此可用于在Angular2就好了.

对于简单的类或样式属性设置,请使用ngStyle Angular 2.0和ng-style