アイコン名となるicon
プロパティを入力で受け入れるディレクティブを作成しようとしています。したがって、ディレクティブは内部的に、クラスを適用するspan
要素を見つけようとします。これは親に適用されるディレクティブ内から可能かどうか疑問に思います。または、子供用のディレクティブも作成する必要がありますか?
これが私のHTMLコードです:
<div sfw-navbar-square sfw-navbar-icon>
<span class="mdi mdi-magnify"></span>
</div>
ディレクティブ自体は次のとおりです。
import { Directive, ElementRef, Renderer } from '@angular/core';
@Directive({
selector: '[sfw-navbar-square]'
})
export class NavbarSquareDirective {
// Here I'd like to define a input prop that takes a string
constructor(private el: ElementRef, private renderer: Renderer) {
this.renderer.setElementClass(this.el.nativeElement, 'navbar-square-item', true);
this.renderer.setElementClass(this.el.nativeElement, 'pointer', true);
this.renderer.setElementClass(this.el.nativeElement, 'met-blue-hover', true);
// Here I'd like to pass that string as a class for the span child element. Can I have access to it from here?
}
}
通常どおりに入力を使用できます。 DOM操作は通常、すべてのビューが初期化されるときにngAfterViewInitで行われますが、アイコンプロパティが設定され、アクセスしようとするViewChildrenがないため、ngOnInitでもおそらく機能します。
HTML:
<div sfw-navbar-square [sfwNavbarIcon]="'my-icon'">
<span class="mdi mdi-magnify"></span>
</div>
ここにディレクティブ自体があります(Angular 4):
import { Directive, ElementRef, Renderer2 } from '@angular/core';
@Directive({
selector: '[sfw-navbar-square]'
})
export class NavbarSquareDirective {
@Input('sfwNavbarIcon') icon:string;
constructor(private el: ElementRef, private renderer: Renderer2) {
this.renderer.addClass(this.el.nativeElement, 'navbar-square-item');
this.renderer.addClass(this.el.nativeElement, 'pointer');
this.renderer.addClass(this.el.nativeElement, 'met-blue-hover');
}
ngAfterViewInit() {
let span = this.el.nativeElement.querySelector('span');
this.renderer.addClass(span, this.icon);
}
}
@Directive({
selector: '[sfw-navbar-square]'
})
export class NavbarSquareDirective {
// Here I'd like to define a input prop that takes a string
constructor(private el: ElementRef, private renderer: Renderer) {
this.renderer.setElementClass(this.el.nativeElement, 'navbar-square-item', true);
this.renderer.setElementClass(this.el.nativeElement, 'pointer', true);
this.renderer.setElementClass(this.el.nativeElement, 'met-blue-hover', true);
let firstChild = this.el.nativeElement.childNodes[0];
firstChild.className = '';
}
}
<div sfw-navbar-square prop="some string" sfw-navbar-icon>
<span class="mdi mdi-magnify"></span>
</div>