在组件的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>
}
}
答案 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
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 编写一个自定义包装类。