2016-10-05 5 views
1

私は、angle2コンポーネントで非同期パイプを使用し、observableを渡しているケースがあります。それはうまく動作します。Angular2 Async Pipeのサブスクリプションを変更する

コンポーネントはまだ生きています。つまり、OnDestroyは呼び出されていないため(非同期パイプが登録されています)、そのオブザーバブルからの登録を解除し、別のコンポーネントに登録します。

どうすればこの問題を解決できますか?ここで

はこのケースを露出させるためにいくつかの擬似コードです:

@Component({ 
    selector: 'pack', 
    template: ` 
    <wolf *ngFor="let wolf of pack | async"> 
     ... 
    </wolf> 
    ` 
}) 
export class PackComponent implements DoCheck { 

    pack; 

    constructor(){ 
     this.pack = Observable.of(northwesthernWolves: Wolf[]) 
    } 

    onDoCheck() { 
     if(some condition) { 
     this.pack = Observable.of(redWolves: Wolf[]) 
     } 
    } 
} 

答えて

3

は、フレームワークがリリースされていることを考えると、すでにこのの世話をすると仮定しても安全です。そして実際に、it is soは:

クラスのプロパティに割り当てられている新しい観測可能
... 
if (obj !== this._obj) { 
    this._dispose(); 
    return this.transform(obj); 
} 
... 

、古いものはasyncパイプによって自動的に解除されます。

逆の動作はメモリリークを引き起こし、バグとみなされる可能性があります。

+0

これは答えません。コンポーネントクラス内の非同期サブスクリプションを変更する必要があります。これらのメソッドは、非同期パイプクラス内で宣言され、実行されます。 – Francisco

+0

答えのポイントは、これについて気にする必要はないということです。フレームワークは 'this.pack = Observable.of(redWolves:Wolf [])'を実行するときにこれを行います。手動で購読を解除する必要があると思われたのは何でしたか?投稿したコードに関連する問題がありますか? – estus

+0

私はそれを行うと、ブラウザがブロックされます。コンポーネントクラスのサブスクリプションを変更する必要がある場合があります。私は詳細を述べます:私の最初のサブスクリプションはSSEイベントですが、私はまた、(両方のサーバーに)約束のコールバックを実行します。 SSEventsのストリームは正常に動作しますが、コールバックが呼び出されると、パイプサブスクリプションをプロミス(配列)の戻り値にリセットします。私はそれをするために退会しなければならないかもしれないと信じますが、わかりません。 – Francisco

関連する問題