0

我已经定义了一个自定义属性指令:

import { Directive, ElementRef } from '@angular/core';
@Directive({
  selector: '.vvdirective'
})
export class VVdirectiveDirective {

  constructor(private elRef: ElementRef) {}
  ngOnInit() {
        this.elRef.nativeElement.style.backgroundColor = "gray";
        this.elRef.nativeElement.style.color = "navy";
        console.log("vv directive works!!")
  }
}

它使用灰色背景和深蓝色字体颜色更改共享“vvdirective”CSS 类的元素。它还打印控制台消息。

它适用于传统用例:

<div class="vvdirective">My custom attribute directive works in a plain old fashion way !</div>

图片: 在此处输入图像描述

当我想在组件中使用此指令时:

HTML:

<div [ngClass]="klass" >My custom attribute directive works even embedded in a component</div>

&TS:

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

@Component({
  selector: 'app-vvdiv',
  templateUrl: './vvdiv.component.html',
  styleUrls: ['./vvdiv.component.scss']
})
export class VvdivComponent implements OnInit {

  @Input() klass: string;

  constructor() { }

  ngOnInit() {
 }

}

& 调用 APP TS:

<app-vvdiv klass="vvdirective"></app-vvdiv>

它不起作用(背景/字体颜色不会改变,也不会打印控制台消息):

图片: 在此处输入图像描述

它应该是这样的:

图片: 在此处输入图像描述

令我惊讶的是,最后两个代码示例(一个带有老式指令调用的示例,以及一个通过组件调用的示例)都具有 CSS 类:

在此处输入图像描述

但只有第一个(未嵌入组件中)受指令更改的影响。

看起来在后一种情况下组件中使用的 ngClass 指令的工作方式不同。

可能跟app的生命周期有关,我不知道。

因此,如果您知道如何同时使用 ngClass 和我的自定义指令来制作组件,我会密切关注您的回答!

这里是Plunker: plunker

这里是 GITHUB 存储库:git repo

最好的,

4

2 回答 2

0

尝试这个

<app-vvdiv (klass)="vvdirective"></app-vvdiv>
于 2020-05-16T08:48:49.860 回答
0

我通过使用带有 input 的指令改变了执行方式。

指令的 TS:

//The directive
import { Directive, ElementRef, Input, Renderer2 } from '@angular/core';

@Directive({
  selector: '[vvdirective]'
})
export class VVdirectiveDirective {
  @Input('vvdirective') params: string;
  constructor(
    private elRef: ElementRef,
    private renderer: Renderer2) { }
  ngOnInit() {
    if (this.params === 'vvstyle number two') {
      console.log("in the first condition for other style number two")
      console.log(this.params)
      this.renderer.setStyle(this.elRef.nativeElement, 'background-color', 'black');
      this.renderer.setStyle(this.elRef.nativeElement, 'color', 'yellow');
    } else {
      console.log("in the default condition for default style")
      console.log(this.params)
      this.renderer.setStyle(this.elRef.nativeElement, 'background-color', 'gray');
      this.renderer.setStyle(this.elRef.nativeElement, 'color', 'navy');
    }
  }
}

嵌入组件的 HTML:

//the call to that directive in the embedded component
<div [vvdirective]="klass">My custom attribute directive works even embedded in a component</div>

应用组件的 HTML:

//the call to that directive in the app component
<div  vvdirective="vvstyle">My custom attribute directive works in a plain old fashion way !</div>
<app-vvdiv klass="vvstyle"></app-vvdiv>
<app-vvdiv klass="vvstyle number two"></app-vvdiv>

这样我就成功地改变了组件的样式(没有 ngClass),并且我还能够触发条件语句(业务规则)。







附件

更新了 git 仓库: https ://github.com/vinny59200/VVAttributeDirectiveAndNgclass

相关插件: https ://plnkr.co/edit/UMuoS0lfxD7OuAsi ?preview

网页截图:
在此处输入图像描述

源码截图:
在此处输入图像描述

于 2020-05-16T14:50:45.743 回答