2016-11-21 4 views
0

私が部品を持っている、と呼ばれています。コンポーネントメソッドから観測可能作成し、それを次のようになり、イベントハンドラ

クリック、ブラーなどの "ネイティブ" DOMイベントのハンドラーであれば、私はObservable.fromEventを使用しましたが、この場合はこれは適用できないようです関係するネイティブイベントはありません)。頭に浮かぶ

唯一のことは、このようなものです:

@Component({ 
    template: ` 
    ... 
    <child-component (childEvent)="onChildEvent()"></child-component> 
` 
}) 
export class ParentComponent implements OnInit, OnDestroy { 
    private childEventStream: Observable<void>; 

    // I am not sure, what is the type of this, 
    // seems like an internal RxJS thing 
    private observer: any; 

    onChildEvent() { 
     this.observer.next(); 
    } 

    ngOnInit() { 
     this.childFinishedStream = Observable.create(
      observer => this.observer = observer; 
     ); 
    } 

    ngOnDestroy() { 
     this.observer.completed(); 
    } 
} 

関与する複数のハンドラがある場合、維持するのは非常に面倒なことがあるので、もっと良い方法がなければならないことを、と思われます。

答えて

0

EventEmitterは欲しいのですか?

これらは、次のように作成されます。Outputを使用して

@Component({ 
    template: ` 
     <child-component (finished)="onChildFinished($event)"></child-component> 
    ` 
}) 
export class ParentComponent { 

    onChildFinished(data: number) { 
     //... 
    } 
} 

と子コンポーネント。

@Component({ 
    selector: 'child-component', 
    template : `hi` 
}) 
export class ChildComponent { 

    @Output() 
    public finished: EventEmitter<number> = new EventEmitter<number>(); 

    private _imFinishing(): void { 
     finished.emit(1); 
    } 
} 

あなたの質問を正しく理解していないかもしれませんが、これはあなたが望むものと思われます。

+0

これは、それが_child_側で行われたのとまったく同じです(そうでなければ、親コントローラ内の子イベントをどのように聞くことができたでしょうか)。 – shylent

+0

ああ、今は良くなっていると思います。子イベントが完了するのを待ち受けたいと思っています。これはangular2ガイドに反しています。データがダウンし、イベントが上がります。サービスを使用し、そこでEventEmitterを設定する方がよいでしょう。あなたの親コンポーネントにそれを聞かせて、あなたのchildComponentがそこで扱うものを何でも入れてください。 – PierreDuc

+0

いいえ、申し訳ありません、それは何か「仕上げ」とは関係ありません。おそらく、私はイベントの悪い(示唆的な)名前を選択しました。私は「仕上げ」という言葉を省くために質問を編集しました。それは特別な意味を持たない子コントローラによって放出されるちょうどイベントです。 – shylent

関連する問題