2015-10-30 9 views
9

W metodzie komponentu wartości @Input zostaną powiązane, więc można sprawdzić te właściwości komponentu, ale nie ma sposobu na sprawdzenie powiązań zdarzeń @Output. Chcę wiedzieć, czy @Output został podłączony do komponentu, czy nie.Czy istnieje sposób sprawdzenia, czy przewód @ Out został wyprowadzony z komponentu w Angular 2?

(używając kątowa 2 Beta 2 oraz maszynopis)

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> 
    } 
} 

Odpowiedz

16

samo podejście jak user1448982 ale bez użycia ObservableWrapper że ma być to kod platforma nie jest wystawiony na działanie przez interfejs API.

(Korzystanie kątowa 2 RC1 i maszynopis)
Uwaga: to tylko rozpoczął pracę od 2.0.0-beta.16 i większej

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; 
    } 
} 

Plunker

Sposób ObservableWrapper.hasSubscribers robi ten wiersz wewnętrznie, więc możesz po prostu zrobić to samo tutaj.

Podczas korzystania maszynopis dostaniesz błąd czasu transpile jeśli kiedykolwiek kątowa kończy się zmianą EventEmitter z Subject (który jest częścią Observable, zatem własność .observers).

3

Poniższy kod powinien działać:

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); 
    } 
} 
+0

Nie należy jednak polegać na tym. Zespół Angular nie daje żadnych gwarancji, że 'EventEmitter' będzie kontynuował' Observable' –