• Angular4 @HostBinding @HostListener


    host属性

    @Component({

    selector: 'jhi-project',

    templateUrl: './project.html',

    styleUrls: [],

    host: { '(window:keydown)': 'keyboardInput($event)' }    //绑定事件和方法

    })

    export class JhiProjectComponent {

        keyboardInput(event) {

            if (event.keyCode == 65 && event.ctrlKey) {

              // ctrl + a

              ....

            }

      }

    }

    @HostListener

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

    定义:

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

    应用:

    // 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: `
        <button counting>增加点击次数</button>
      `
    })
    export class AppComponent {}

    以上代码运行结果:

    此外,还可以监听宿主元素外,其他对象产生的事件,如windown或document对象。

    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);
        }
    }
    import {HostListener} from '@angular/core';
    
    @HostListener('window:keydown', ['$event'])
    onKeyDown(event: KeyboardEvent) {
      ...
    }

    app.component.ts

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

    也可以在指定的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 是属性装饰器,用来动态设置宿主元素的属性值。

    定义:

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

    应用:

    @HostBindings('attr.foo') foo = 'bar'

    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: `
        <button exeButtonPress>按下按钮</button>
      `
    })
    export class AppComponent { }

    我们也可以在指令的 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;
        }
    }
  • 相关阅读:
    关于正餐智能POS6.0.1.1改版后,点击反结账进入点菜界面后无法进行加菜的FAQ
    关于正餐智能POS6.0.1.1改版后,订单模块无法进行部分退款的FAQ
    退款证书相关
    简易付主副机和打印机配置
    秒点直连操作文档
    智能POS打印配置&常见问题FAQ 12-14 后期持续更新
    ERP主副机和打印机配置FAQ
    ASP.NET没有魔法——ASP.NET MVC Controller的实例化与执行
    ASP.NET没有魔法——ASP.NET MVC 路由的匹配与处理
    ASP.NET没有魔法——ASP.NET MVC路由
  • 原文地址:https://www.cnblogs.com/xuepei/p/8027188.html
Copyright © 2020-2023  润新知