在我漫游的世界各地互联网,现在尤其是角。我发现很多@HostBinding和@HostListener的引用。它们似乎是相当基本的,但不幸的是,目前它们的文档有点粗略。

谁能解释一下它们是什么,它们是如何工作的,并举例说明它们的用法吗?


当前回答

一个帮助我记住他们做什么的小技巧——

HostBinding括号(“价值”);与[value]="myValue"完全相同

And

HostListener('click') myClick(){}与(click)="myClick()"完全相同


HostBinding和HostListener是用指令编写的 而其他的……和……]被写在(组件的)模板中。

其他回答

简介:

@HostBinding:这个装饰器将一个类属性绑定到宿主元素的属性上。 @HostListener:这个装饰器将一个类方法绑定到host元素的事件。

例子:

import { Component, HostListener, HostBinding } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `<p>This is nice text<p>`,
})
export class AppComponent  {

  @HostBinding('style.color') color; 

  @HostListener('click')
  onclick() {
    this.color =  'blue';
  }

}

在上面的例子中,会发生以下情况:

事件监听器被添加到click事件中,当组件中的任何地方发生click事件时,该监听器将被触发 AppComponent类中的color属性绑定到样式。属性。因此,每当color属性更新时,样式也会更新。我们组件的Color属性 结果是,每当有人点击组件时,颜色就会更新。

@Directive中的用法:

虽然它可以用在组件上,但这些装饰器通常用在属性指令中。当在@Directive中使用时,宿主会改变指令所在的元素。例如,看一下这个组件模板:

<p p_Dir>some paragraph</p>

这里的p_Dir是一个关于<p>元素的指令。当在指令类中使用@HostBinding或@HostListener时,主机现在将引用<p>。

下面是一个基本的悬停例子。

组件的模板属性:

模板

<!-- attention, we have the c_highlight class -->
<!-- c_highlight is the selector property value of the directive -->

<p class="c_highlight">
    Some text.
</p>

我们的指令

import {Component,HostListener,Directive,HostBinding} from '@angular/core';

@Directive({
    // this directive will work only if the DOM el has the c_highlight class
    selector: '.c_highlight'
 })
export class HostDirective {

  // we could pass lots of thing to the HostBinding function. 
  // like class.valid or attr.required etc.

  @HostBinding('style.backgroundColor') c_colorrr = "red"; 

  @HostListener('mouseenter') c_onEnterrr() {
   this.c_colorrr= "blue" ;
  }

  @HostListener('mouseleave') c_onLeaveee() {
   this.c_colorrr = "yellow" ;
  } 
}

@HostBinding的另一个好处是,如果你的绑定直接依赖于一个输入,你可以将它与@Input结合起来,例如:

@HostBinding('class.fixed-thing')
@Input()
fixed: boolean;
// begginers
@Component({
  selector: 'custom-comp',
  template: ` <div class="my-class" (click)="onClick()">CLICK ME</div> `,
})
export class CustomComp {
  onClick = () => console.log('click event');
}

// pros
@Component({
  selector: 'custom-comp',
  template: ` CLICK ME `,
})
export class CustomComp {
  @HostBinding('class') class = 'my-class';
  @HostListener('click') onClick = () => console.log('click event');
}

// experts
@Component({
  selector: 'custom-comp',
  template: ` CLICK ME `,
  host: {
    class: 'my-class',
    '(click)': 'onClick()',
  },
})
export class CustomComp {
  onClick = () => console.log('click event');
}

------------------------------------------------
The 1st way will result in:
<custom-comp>
   <div class="my-class" (click)="onClick()">
      CLICK ME
   <div>
</custom-comp>

The last 2 ways will result in:
<custom-comp class="my-class" (click)="onClick()">
   CLICK ME
</custom-comp>

一个帮助我记住他们做什么的小技巧——

HostBinding括号(“价值”);与[value]="myValue"完全相同

And

HostListener('click') myClick(){}与(click)="myClick()"完全相同


HostBinding和HostListener是用指令编写的 而其他的……和……]被写在(组件的)模板中。