2017-04-24 62 views
0

我和@Hostbinding类似的问题像其他问题一样,但我无法解决这个问题。Angular @Hostbinding不起作用

我的模板:

<main class="my_active"> 


    <user myDirective="'false'"> 
    </user> 
</main> 

我的指令

@Directive({ 
    selector:'[myDirective]' 
}) 

export class MyDerective { 


    @HostBinding('class.img') 
    isMyCirclePic:boolean; 

    @HostListener('mouseover') 
    onMouseEnter(){ 
     console.log('VALUE BEFORE:', this.isMyCirclePic); 
     console.log('MAUS ENTER'); 
     this.isMyCirclePic=true; 
     console.log('VALUE AFTER:', this.isMyCirclePic); 

    } 

    @HostListener('mouseleave') 
    onMouseLeave(){ 
     console.log('VALUE BEFORE:', this.isMyCirclePic); 
     console.log('MAUS LEAVE'); 
     this.isMyCirclePic=false; 
     console.log('VALUE AFTER:', this.isMyCirclePic); 
    } 
} 
  1. 的问题是,我的isMyCirclePic是不确定的第一次。之后,它将被设定为虚假。我多次使用相同的模板,当我点击其他模板(来自同一类型的模板)时,所以isMyCirclePic也未定义。
  2. 我在事件中改变了真或假,但它不会被渲染。我的'class.img'图片每次都保持相同的值。

UPDATE

我已经尝试了与@input @HostBinding解决方案。

<main class="my_active"> 
    <user 
     myDerective 
     [myColor]="font_color"> 
    </user> 
</main> 

而且我myColor-Direktive:

@Directive({ 
    selector:'[myColor]' 
}) 
export class MyColor { 

    @HostBinding('style.color') 
    font_color:string; 

    @Input() 
    set myColor(color:string) { 
     this.font_color = color; 
     console.log('COLOR VALUE SET:', this.font_color); 
    } 

    get myColor():string{ 
     console.log('COLOR VALUE GET:', this.font_color); 
     return this.font_color; 
    } 
} 

但它仍然没有工作。我可以看到,该值将通过@ Input-param传递。我可以看到,这个设置函数将被调用。但我看不到,那个get函数会被调用,我期望的。所以我看不到变化。

回答

1

你可以使用@input()@HostBinding

@Directive({ 
    selector:'[myDirective]' 
}) 

export class MyDerective { 
    @Input() @HostBinding('class.img') isMyCirclePic:boolean; 

    @HostListener('mouseover') 
    onMouseEnter(){ 
     console.log('VALUE BEFORE:', this.isMyCirclePic); 
     console.log('MAUS ENTER'); 
     this.isMyCirclePic=true; 
     console.log('VALUE AFTER:', this.isMyCirclePic); 

    } 

    @HostListener('mouseleave') 
    onMouseLeave(){ 
     console.log('VALUE BEFORE:', this.isMyCirclePic); 
     console.log('MAUS LEAVE'); 
     this.isMyCirclePic=false; 
     console.log('VALUE AFTER:', this.isMyCirclePic); 
    } 
} 

将其绑定在tmeplate

<div myDirective [isMyCirclePic]="false"> 
      myDirective 
</div> 
+0

THX。这很好的解决方案,但我应该可以做到这一点,没有@input。至少我可以使用它。 –

+0

您可以重新使用指令的名称和它的名称,所以html看起来像[myDirective] ='false'和@Input ... myDirective –

+0

这是很好的解决方法,但它应该起作用。 例如,我可以在这里看到@Hostbinding的描述,那必须工作: https://codecraft.tv/courses/angular/custom-directives/hostlistener-and-hostbinding/ –