博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Angular 2 HostListener & HostBinding
阅读量:6436 次
发布时间:2019-06-23

本文共 4061 字,大约阅读时间需要 13 分钟。

阅读 Angular 6/RxJS 最新教程,请访问

Host Element

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

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

高亮的文本

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

高亮的文本

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

HostListener

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

HostListenerDecorator 装饰器定义

export interface HostListenerDecorator {    (eventName: string, args?: string[]): any;    new (eventName: string, args?: string[]): any;}

HostListenerDecorator 装饰器应用

counting.directive.ts

import { Directive, HostListener } from '@angular/core';@Directive({    selector: 'button[counting]'})class CountClicks {    numberOfClicks = 0;    @HostListener('click', ['$event.target'])    onClick(btn: HTMLElement) {        console.log('button', btn, 'number of clicks:', this.numberOfClicks++);    }}

app.component.ts

import { Component} from '@angular/core';@Component({  selector: 'exe-app',  styles: [`    button {      background: blue;      color: white;      border: 1px solid #eee;    }  `],  template: `      `})export class AppComponent {}

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

图片描述

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

highlight.directive.ts

import { Directive, HostListener, ElementRef, Renderer } from '@angular/core';@Directive({    selector: '[exeHighlight]'})export class ExeHighlight {    constructor(private el: ElementRef, private renderer: Renderer) { }    @HostListener('document:click', ['$event'])    onClick(btn: Event) {        if (this.el.nativeElement.contains(event.target)) {            this.highlight('yellow');        } else {            this.highlight(null);        }    }    highlight(color: string) {        this.renderer.setElementStyle(this.el.nativeElement, 'backgroundColor', color);    }}

app.component.ts

import { Component} from '@angular/core';@Component({  selector: 'exe-app',  template: `    

点击该区域,元素会被高亮。点击其它区域,元素会取消高亮

`})export class AppComponent {}

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

图片描述

Host Event Listener

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

counting.directive.ts

import { Directive } from '@angular/core';@Directive({    selector: 'button[counting]',    host: {      '(click)': 'onClick($event.target)'    }})export class CountClicks {    numberOfClicks = 0;    onClick(btn: HTMLElement) {        console.log('button', btn, 'number of clicks:', this.numberOfClicks++);    }}

HostBinding

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

HostBinding 装饰器定义

export interface HostBindingDecorator {    (hostPropertyName?: string): any;    new (hostPropertyName?: string): any;}

HostBinding 装饰器应用

button-press.directive.ts

import { Directive, HostBinding, HostListener } from '@angular/core';@Directive({    selector: '[exeButtonPress]'})export class ExeButtonPress {    @HostBinding('attr.role') role = 'button';    @HostBinding('class.pressed') isPressed: boolean;    @HostListener('mousedown') hasPressed() {        this.isPressed = true;    }    @HostListener('mouseup') hasReleased() {        this.isPressed = false;    }}

app.component.ts

import { Component } from '@angular/core';@Component({  selector: 'exe-app',  styles: [`    button {      background: blue;      color: white;      border: 1px solid #eee;    }    button.pressed {      background: red;    }  `],  template: `      `})export class AppComponent { }

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

图片描述

Host Property Bindings

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

button-press.directive.ts

import { Directive, HostListener } from '@angular/core';@Directive({    selector: '[exeButtonPress]',    host: {      'role': 'button',      '[class.pressed]': 'isPressed'    }})export class ExeButtonPress {    isPressed: boolean;    @HostListener('mousedown') hasPressed() {        this.isPressed = true;    }    @HostListener('mouseup') hasReleased() {        this.isPressed = false;    }}

我有话说

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

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

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

详细信息请参考 -

转载地址:http://flhga.baihongyu.com/

你可能感兴趣的文章
Scheme 中的 pair 和 list 简述
查看>>
iOS AVAssetExportSession 视频剪切、合并、压缩
查看>>
我收藏的技术知识图(每张都是大图)
查看>>
Spring Boot制作启动图案
查看>>
《Linux内核设计与实现》读书笔记(十一)- 定时器和时间管理
查看>>
hdu Oil Deposits
查看>>
彻底理解javascript中的this指针
查看>>
SAS去空格
查看>>
MySQL用户和权限管理
查看>>
Spring Cloud构建微服务架构(二)服务消费者
查看>>
这些老外的开源技术养活了一票国产软件
查看>>
Maven实战(六)--- dependencies与dependencyManagement的区别
查看>>
创业者应该有的5个正常心态(转)
查看>>
php模式设计之 注册树模式
查看>>
【Android UI设计与开发】3.引导界面(三)实现应用程序只启动一次引导界面
查看>>
_ENV和_G
查看>>
别做操之过急的”无效将军”,做实实在在的”日拱一卒” 纵使一年不将军,不可一日不拱卒...
查看>>
Oracle Grid Infrastructure: Understanding Split-Brain Node Eviction (文档 ID 1546004.1)
查看>>
Linux改变进程优先级的nice命令
查看>>
**16.app后端如何保证通讯安全--url签名
查看>>