我有嵌套ul li
元素,如下所示。我想改变
所选background-color
节点的li
同时点击它时
不应更改未选择的节点background-color
。
<ul Parent>
<li Child>Child1</li>
<li Child>Child2</li>
<ul Parent>
<li Child>Child1</li>
<li Child>Child2</li>
<ul Parent>
<li Child>Child1</li>
<li Child>Child2</li>
<li Child>Child3</li>
<li Child>Child4</li>
<li Child>Child5</li>
</ul>
<li Child>Child3</li>
<li Child>Child4</li>
<li Child>Child5</li>
</ul>
<li Child>Child3</li>
<li Child>Child4</li>
<li Child>Child5</li>
</ul>
import { Directive,ElementRef,HostListener,ViewChild } from '@angular/core';
@Directive({
selector: '[Parent]'
})
export class ParentDirective {
constructor(private elem:ElementRef) {}
@HostListener('click') doOnClick(){
this.changeBackgroundColor("red");
}
private changeBackgroundColor(color: string) {
this.elem.nativeElement.style.backgroundColor = color;
}
}
我已经创建了一个父指令,可以在选择的任何节点上将background-color
更改为白色,并创建一个子节点指令,在节点选择时将background-color
设置为红色。
import { Directive,ElementRef,HostListener,ViewChild } from '@angular/core';
@Directive({
selector: '[Child]'
})
export class ChildDirective{
constructor(private elem:ElementRef) {
this.printNativeElements(elem)
}
printNativeElements(elem){
this.liCount++;
console.log(elem.nativeElement.parentNode.children.length);
}
@HostListener('click') doOnClick(){
this.changeBackgroundColor("red");
}
private changeBackgroundColor(color: string) {
this.elem.nativeElement.style.backgroundColor = color;
}
}
答案 0 :(得分:0)
我会这样做
@Injectable()
class Shared {
selected: any;
}
@Directive({
selector: '[Parent]'
// providers: [Shared],
})
export class ParentDirective {
constructor(private shared:Shared) {}
@HostListener('click')
clickHandler() {
share.selected = this;
}
@HostBinding('class.selected')
get isSelectedClass() {
return shared.selected == this;
}
}
@Directive({
selector: '[Child]'
})
export class ChildDirective{
constructor(private shared:Shared) {}
@HostListener('click')
clickHandler() {
share.selected = this;
}
@HostBinding('class.selected')
get isSelectedClass() {
return shared.selected == this;
}
}
<ul Parent>
<li Child>Child1</li>
<li Child>Child2</li>
<ul Parent>
<li Child>Child1</li>
<li Child>Child2</li>
<ul Parent>
<li Child>Child1</li>
<li Child>Child2</li>
<li Child>Child3</li>
<li Child>Child4</li>
<li Child>Child5</li>
</ul>
<li Child>Child3</li>
<li Child>Child4</li>
<li Child>Child5</li>
</ul>
<li Child>Child3</li>
<li Child>Child4</li>
<li Child>Child5</li>
</ul>
在共享服务和指令中使用observable而不是使用getter可能更有效,可以订阅它并更新isSelectedClass
属性而不是getter。