当前位置:   article > 正文

Angular 2 HostListener & HostBinding

hostlistener监听span标签
阅读 Angular 6/RxJS 最新教程,请访问 前端修仙之路

Host Element

在介绍 HostListener 和 HostBinding 属性装饰器之前,我们先来了解一下 host element (宿主元素)。

宿主元素的概念同时适用于指令和组件。对于指令来说,这个概念是相当简单的。应用指令的元素,就是宿主元素。假设我们已声明了一个 HighlightDirective 指令 (selector: '[exeHighlight]'):

  1. <p exeHighlight>
  2. <span>高亮的文本</span>
  3. </p>

上面 html 代码中,p 元素就是宿主元素。如果该指令应用于自定义组件中如:

  1. <exe-counter exeHighlight>
  2. <span>高亮的文本</span>
  3. </exe-counter>

此时 exe-counter 自定义元素,就是宿主元素。

HostListener

HostListener 是属性装饰器,用来为宿主元素添加事件监听。

HostListenerDecorator 装饰器定义

  1. export interface HostListenerDecorator {
  2. (eventName: string, args?: string[]): any;
  3. new (eventName: string, args?: string[]): any;
  4. }

HostListenerDecorator 装饰器应用

counting.directive.ts

  1. import { Directive, HostListener } from '@angular/core';
  2. @Directive({
  3. selector: 'button[counting]'
  4. })
  5. class CountClicks {
  6. numberOfClicks = 0;
  7. @HostListener('click', ['$event.target'])
  8. onClick(btn: HTMLElement) {
  9. console.log('button', btn, 'number of clicks:', this.numberOfClicks++);
  10. }
  11. }

app.component.ts

  1. import { Component} from '@angular/core';
  2. @Component({
  3. selector: 'exe-app',
  4. styles: [`
  5. button {
  6. background: blue;
  7. color: white;
  8. border: 1px solid #eee;
  9. }
  10. `],
  11. template: `
  12. <button counting>增加点击次数</button>
  13. `
  14. })
  15. export class AppComponent {}

以上代码运行后浏览器显示的结果:

图片描述

此外,我们也可以监听宿主元素外,其它对象产生的事件,如 windowdocument 对象。具体示例如下:

highlight.directive.ts

  1. import { Directive, HostListener, ElementRef, Renderer } from '@angular/core';
  2. @Directive({
  3. selector: '[exeHighlight]'
  4. })
  5. export class ExeHighlight {
  6. constructor(private el: ElementRef, private renderer: Renderer) { }
  7. @HostListener('document:click', ['$event'])
  8. onClick(btn: Event) {
  9. if (this.el.nativeElement.contains(event.target)) {
  10. this.highlight('yellow');
  11. } else {
  12. this.highlight(null);
  13. }
  14. }
  15. highlight(color: string) {
  16. this.renderer.setElementStyle(this.el.nativeElement, 'backgroundColor', color);
  17. }
  18. }

app.component.ts

  1. import { Component} from '@angular/core';
  2. @Component({
  3. selector: 'exe-app',
  4. template: `
  5. <h4 exeHighlight>点击该区域,元素会被高亮。点击其它区域,元素会取消高亮</h4>
  6. `
  7. })
  8. export class AppComponent {}

以上代码运行后浏览器显示的结果:

图片描述

Host Event Listener

我们也可以在指令的 metadata 信息中,设定宿主元素的事件监听信息,具体示例如下:

counting.directive.ts

  1. import { Directive } from '@angular/core';
  2. @Directive({
  3. selector: 'button[counting]',
  4. host: {
  5. '(click)': 'onClick($event.target)'
  6. }
  7. })
  8. export class CountClicks {
  9. numberOfClicks = 0;
  10. onClick(btn: HTMLElement) {
  11. console.log('button', btn, 'number of clicks:', this.numberOfClicks++);
  12. }
  13. }

HostBinding

HostBinding 是属性装饰器,用来动态设置宿主元素的属性值。

HostBinding 装饰器定义

  1. export interface HostBindingDecorator {
  2. (hostPropertyName?: string): any;
  3. new (hostPropertyName?: string): any;
  4. }

HostBinding 装饰器应用

button-press.directive.ts

  1. import { Directive, HostBinding, HostListener } from '@angular/core';
  2. @Directive({
  3. selector: '[exeButtonPress]'
  4. })
  5. export class ExeButtonPress {
  6. @HostBinding('attr.role') role = 'button';
  7. @HostBinding('class.pressed') isPressed: boolean;
  8. @HostListener('mousedown') hasPressed() {
  9. this.isPressed = true;
  10. }
  11. @HostListener('mouseup') hasReleased() {
  12. this.isPressed = false;
  13. }
  14. }

app.component.ts

  1. import { Component } from '@angular/core';
  2. @Component({
  3. selector: 'exe-app',
  4. styles: [`
  5. button {
  6. background: blue;
  7. color: white;
  8. border: 1px solid #eee;
  9. }
  10. button.pressed {
  11. background: red;
  12. }
  13. `],
  14. template: `
  15. <button exeButtonPress>按下按钮</button>
  16. `
  17. })
  18. export class AppComponent { }

以上代码运行后浏览器显示的结果:

图片描述

Host Property Bindings

我们也可以在指令的 metadata 信息中,设定宿主元素的属性绑定信息,具体示例如下:

button-press.directive.ts

  1. import { Directive, HostListener } from '@angular/core';
  2. @Directive({
  3. selector: '[exeButtonPress]',
  4. host: {
  5. 'role': 'button',
  6. '[class.pressed]': 'isPressed'
  7. }
  8. })
  9. export class ExeButtonPress {
  10. isPressed: boolean;
  11. @HostListener('mousedown') hasPressed() {
  12. this.isPressed = true;
  13. }
  14. @HostListener('mouseup') hasReleased() {
  15. this.isPressed = false;
  16. }
  17. }

我有话说

1.宿主元素属性和事件绑定风格指南

优先使用 @HostListener 和 @HostBinding ,而不是 @Directive 和 @Component 装饰器的 host 属性:

对于关联到 @HostBinding 的属性或关联到 @HostListener 的方法,要修改时,只需在指令类中的一个地方修改。 如果使用元数据属性 host,你就得在组件类中修改属性声明的同时修改相关的元数据。

详细信息请参考 - Angular 2 风格指南 - STYLE 06-03

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/223087
推荐阅读
  

闽ICP备14008679号