有没有办法从Angular 2中的组件内检查@Output连线?

时间:2015-10-30 17:12:01

标签: angular typescript

在组件的ngOnInit方法中,@ Invput值已被绑定,因此您可以检查组件上的这些属性,但似乎没有办法检查@Output事件绑定。我希望能够知道@Output是否已连接到组件上。

(使用Angular 2 beta 2和TypeScript)

import {Component, Output, EventEmitter} from 'angular2/core';

@Component({
    selector: 'sample',
    template: `<p>a sample</p>`
})
export class SampleComponent {
    @Output() cancel = new EventEmitter();

    ngOnInit() {
        // would like to check and see if cancel was used
        // on the element <sample (cancel)="doSomething()"></sample> 
        // or not <sample></sample>
    }
}

3 个答案:

答案 0 :(得分:35)

user1448982相同,但不使用ObservableWrapper,而import {Component, Output, EventEmitter} from '@angular/core'; @Component({ selector: 'sample', template: `<p>a sample</p>` }) export class SampleComponent { @Output() cancel = new EventEmitter(); private isCancelUsed = false; ngOnInit() { this.isCancelUsed = this.cancel.observers.length > 0; } } 是未通过api公开的平台代码。

(使用Angular 2 RC1和TypeScript)
注意:这仅从2.0.0-beta.16及更高版本

开始
ObservableWrapper.hasSubscribers

Plunker

EventEmitter方法在内部执行此行,因此您可以在此处执行相同的操作。

使用TypeScript时,如果Angular最终更改了Subject Observable(即.observers,那么{{1}属性)。

答案 1 :(得分:3)

以下代码应该有效:

import {Component, Output, EventEmitter, OnInit} from 'angular2/core';
import {ObservableWrapper} from 'angular2/src/facade/async';

@Component({
    selector: 'sample',
    template: `<p>a sample</p>`
})
export class SampleComponent implements OnInit {
    @Output() cancel: EventEmitter<any> = new EventEmitter();

    private isCancelUsed: boolean;

    ngOnInit(): void {
        this.isCancelUsed = ObservableWrapper.hasSubscribers(this.cancel);
    }
}

答案 2 :(得分:1)

Angular 12 删除了 EventEmitter#observables 字段,因此接受的答案不再有效。

现在的替代解决方案是转换为主题:

get hasOutputEventSubscriber() {
    return (this.cancel as Subject).observers;
}

请注意,此属性也已弃用,并将在 rxjs v8 中删除。一个面向未来的解决方案是为 EventEmitter 编写一个自定义包装类。