【问题标题】:Angular2 CSS style/class strings as inputs to componentAngular2 CSS 样式/类字符串作为组件的输入
【发布时间】:2017-08-13 15:27:01
【问题描述】:

背景

我有一个包含两个span 元素的组件。我希望父组件能够通过将 CSS 类和样式指定为输入(最好是简单的字符串)来设置内部两个 spans 的样式。这是我希望它看起来像的简化示例:

代码

应用组件(父级)

@Component({
  selector: 'my-app',
  template: `
    <div>
      <app-two-spans [classArg1]="'class1'" [classArg2]="'class2'"
                     [styleArg1]="'width: 100px'" [styleArg2]="'width:200px'"></app-two-spans>
    </div>
  `, style: `
    ::ng-deep .class1 {
      border: 1px solid black;
    }
    ::ng-deep .class2 {
      border: 1px solid blue;
    }
  `
})
export class App {

}

两个跨度组件(子)

import {Component, Input, Output, EventEmitter} from '@angular/core';

@Component({
    selector: 'app-two-spans',
    template: `
        <span *ngIf="flag" [ngClass]="classArg1" [ngStyle]="styleArg1" 
              (click)="flag = !flag">click me</span>
        <span *ngIf="!flag" [ngClass]="classArg2" [ngStyle]="styleArg2" 
              (blur)="flag = !flag" contenteditable="true">
              click me to change my value</span> 
    `
})
export class TwoSpansComponent {
  flag: boolean = true;
  @Input() styleArg1: string;
  @Input() styleArg2: string;
  @Input() classArg1: string;
  @Input() classArg2: string;
  constructor() {}
}

问题

类样式似乎适用于我的本地环境(尽管由于某种原因它似乎不适用于 Plunker)。但是,styles 没有出现。我看过其他关于样式作为输入的帖子,但据我所知,这通常是通过传递样式-值对 (see accepted answer here) 来完成的。但是,我真的很想将这些样式作为一个简单的字符串传递,以便更轻松地使用组件。 我在控制台中注意到以下错误:ERROR Error: Cannot find a differ supporting object 'width: 100px'。我完全不确定这意味着什么。

Plunker here

有没有办法做到这一点?如何赋予父组件样式化子组件的能力?

【问题讨论】:

  • 你对 plunker 有误,应该是样式:`` 用数组而不是 style
  • ^ 它是关于组件的。此外,[ngStyle] 接受对象而不是字符串。
  • 我猜 ng-deep 应该有 :host 才能正常工作。 :host ::ng-deep .class1 {
  • 感谢您对 [ngStyle] 的澄清。我仍然想要一种将 css 样式作为输入作为简单字符串传递的方法
  • 我的意思是它应该始终是一个数组,如果它有一个所有样式都内联的字符串。 @Component 装饰器没有 style 属性。

标签: css angular


【解决方案1】:

ngStyle 接受 Object 而不是纯字符串。您可以将样式传递为:

[styleArg1]="{ width: '100px' }"
[styleArg2]="{ width: '200px' }"

【讨论】:

  • 嗯,这可能是一个很好的起点。也许我可以使用正则表达式编写一个函数,将纯 css 字符串转换为这样的对象,这样我就可以编写 [styleArg1]=" 'width: 100px' " as desired
猜你喜欢
  • 2011-12-19
  • 2013-03-08
  • 2012-04-17
  • 2018-06-26
  • 2015-09-24
  • 1970-01-01
  • 2011-10-30
  • 2011-06-08
  • 1970-01-01
相关资源
最近更新 更多