Angular 2 - 将条件样式应用于指令的子HTML元素

Chr*_*ris 7 angular2-directives angular2-template angular

我正在尝试基于click事件将类应用于HTML元素.从父组件的模板设置子组件的选择器的类属性时,这可以正常工作,如下面的父组件片段所示:

[class.bordered]='isSelected(item)'
Run Code Online (Sandbox Code Playgroud)

这将适当地设置单击该项目时的样式.但是,我想基于相同类型的click事件在子组件中设置内部HTML元素的类,这里是子组件样式的所需目标:

template: `
  <div class="This is where I really want to apply the style">  
    {{ item.val }}
  </div>
`
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,很容易支持?或者这被认为是一种不好的做法,我应该设计我的组件以避免这种条件样式的情况?

完整代码:

@Component({
  selector: 'parent-component',
  directives: [ChildComponent],
  template: `
    <child-component
      *ngFor='#item of items'
      [item]='item'
      (click)='clicked(item)'
      [class.bordered]='isSelected(item)'>
    </child-component>
  `
})
export class ParentComponent {
  items: Item[];
  currentItem: item;

  constructor(private i: ItemService) {
    this.items = i.items;
  }

  clicked(item: Item): void {
    this.currentItem = item;
  }

  isSelected(item: Items): boolean {
    if (!item || !this.currentItem) {
      return false;
    }
    return item.val === this.currentItem.val;
  }
}


@Component({
  selector: 'child-component',
  inputs: ['item'],
  template: `
    <div class="This is where I really want to apply the style">  
      {{ item.val }}
    </div>
  `
})
export class ChildComponent {}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 4

我找到了一种更好的方法来解决这个问题,充分利用 Angular2 的功能。

具体来说,您可以通过更改以下内容将变量传递给子组件,而不是使用 :host 和 CSS 功能进行欺骗:

[class.bordered]='isSelected(item)'
Run Code Online (Sandbox Code Playgroud)

在子类的元素中设置将其更改为

[isBordered]='isSelected(item)'
Run Code Online (Sandbox Code Playgroud)

然后,在您想要在子组件模板中应用边框类的 div 上,只需添加:

[ngClass]='{bordered: isBordered}'
Run Code Online (Sandbox Code Playgroud)

以下是经过更改的完整代码:

@Component({
  selector: 'parent-component',
  directives: [ChildComponent],
  template: `
    <child-component
      *ngFor='#item of items'
      [item]='item'
      (click)='clicked(item)'
      [isBordered]='isSelected(item)'>
    </child-component>
  `
})
export class ParentComponent {
  items: Item[];
  currentItem: item;

  constructor(private i: ItemService) {
    this.items = i.items;
  }

  clicked(item: Item): void {
    this.currentItem = item;
  }

  isSelected(item: Items): boolean {
    if (!item || !this.currentItem) {
      return false;
    }
    return item.val === this.currentItem.val;
  }
}


@Component({
  selector: 'child-component',
  inputs: ['item'],
  template: `
    <div [ngClass]='{bordered: isBordered}'>
      {{ item.val }}
    </div>
  `
})
export class ChildComponent {}
Run Code Online (Sandbox Code Playgroud)