首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular 6 Renderer.listen to Directive event

Angular 6 Renderer.listen to Directive event
EN

Stack Overflow用户
提问于 2019-04-28 07:19:20
回答 1查看 1.7K关注 0票数 0

我正在尝试侦听元素上的指令事件。Renderer.listen不会接手这件事。

HTML代码:

代码语言:javascript
复制
<a click-elsewhere #assignmentOptions>
    <pp-click-dropdown [clickElement]="assignmentOptions">
        <a>Test Button</a>
    </pp-click-dropdown>
</a>

pp-click-DROPDOW.TS- clickElsewhere()是'click-elsewhere‘指令中的指令事件。这是事件正在正确发出。我没有收到任何错误,Renderer.listen只是没有拾取指令事件。

代码语言:javascript
复制
import { Component, EventEmitter, Input, Output, Renderer, OnInit } from '@angular/core';

@Component({
    selector: 'pp-click-dropdown',
    templateUrl: 'panelply-click-dropdown.component.html',
})

export class PanelPlyClickDropdownComponent implements OnInit {
    @Input() clickElement: Element;
    @Output() onDropdownClick: EventEmitter<any> = new EventEmitter();

    private renderer: Renderer;

    constructor(_renderer: Renderer) {
        this.renderer = _renderer;
    }

    ngOnInit() {
        this.renderer.listen(this.clickElement, 'click', (event) => {
            this.toggleDropDown(event);
        }); // this line is working properly
        this.renderer.listen(this.clickElement, 'clickElsewhere', (event) => {
            console.log('clicked oustide')
            this.closeDropdown(event);
        }); // this line is not working
    }

    toggleDropDown(e) {
        this.isShown = !this.isShown;
        this.onDropdownClick.emit(e);
    }

    closeDropdown(event: Object) {
        if (event && event['value'] === true) {
            this.isShown = false;
        }
    }
}

单击-click where.ts(指令)

代码语言:javascript
复制
import { Directive, ElementRef, EventEmitter, OnDestroy, OnInit, Output, HostListener } from '@angular/core';
import { Subscription } from 'rxjs';

@Directive({
    selector: '[click-elsewhere]'
})

export class ClickElsewhereDirective implements OnInit, OnDestroy {
    @Output() clickElsewhere: EventEmitter<Object>;

    constructor(private _elRef: ElementRef) {
        this.clickElsewhere = new EventEmitter();
    }

    @HostListener('document:click', ['$event.target'])
    public onClick(targetElement) {
        const clickedInside = this._elRef.nativeElement.contains(targetElement);
        if (!clickedInside) {
            console.log('clicked outside source')
            this.clickElsewhere.emit(null);
        }
    }
}

我是不是漏掉了什么?listen不工作是因为指令事件不是DOM事件吗?有没有办法做到这一点?

EN

回答 1

Stack Overflow用户

发布于 2019-04-28 07:33:54

这并不是我想要的方式,因为我想让‘click- later’和'pp-click-dropdown‘模块化,我不想在不同的元素上遇到潜在的问题,但它是有效的:

代码语言:javascript
复制
<a click-elsewhere (clickElsewhere)="dropdown.isShown = false;" #assignmentOptions>
    <pp-click-dropdown #dropdown [clickElement]="assignmentOptions">
        <a>Test Button</a>
    </pp-click-dropdown>
</a>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55885670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档