用于从嵌套的ul li元素更改所选li的颜色的Angular指令

时间:2017-12-16 10:13:39

标签: angular directive angular2-directives

我有嵌套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;
  }  
}

1 个答案:

答案 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。

相关问题