2017-03-23 10 views
2

私は非同期パイプがobservableで動作することを理解しており、後で来る予定のデータを非同期に読み込むのに役立ちます。Angular2なぜ非同期パイプ

しかし、私も非同期を使用せずに作業することができます。続き は

..... 

<label>Prop</label> 
<span>{{someProp}}</span> 
<label>List</label> 
<span *ngFor="let item of someList">{{item}}</span> 

コード上記のコード

コンポーネント

export class XComponent{ 
    someProp: string; 
    someList: string[]; 
    someFn(){ 
      this.someService.subscribe(
       data=>{ 
        this.someProp = data.prop; 
        this.someList = data.list; 
       } 
     ); 
    } 
} 

テンプレートは、非同期を使用せずに、あらゆる問題なく私の作品です。 なぜ非同期を使用する必要がありますか?それはデータの変数を宣言する必要がなく、直接観測可能なものを使うことができるからです(データの代わりに観測値を宣言する必要があります)。コードは非同期例えば、角度のドキュメントから、その代わりの

@Component({ 
    selector: 'async-observable-pipe', 
    template: '<div><code>observable|async</code>: Time: {{ time | async }}</div>' 
}) 
export class AsyncObservablePipeComponent { 
    time = new Observable<string>((observer: Subscriber<string>) => { 
    setInterval(() => observer.next(new Date().toString()), 1000); 
    }); 
} 

を取られ後

EDIT

私は2番目のコードがあまりにもきれいに見える私には

@Component({ 
    selector: 'async-observable-pipe', 
    template: '<div><code>observable|async</code>: Time: {{ time }}</div>' 
}) 
export class AsyncObservablePipeComponent { 
    time; 
    constructor(){ 
    setInterval(() => time = new Date().toString(), 1000); 
    } 
} 

を書くことができます。 (クリーナーでさえ)

+2

非同期パイプが内部にサブスクリプションを避けるためです:あなたが与えた新しい例を支援します。非同期パイプの動作は、オブザーバーがデータをループ変数に戻すようにサブスクライブし、そのオブザーバーを自動的に登録解除することです。 –

+0

@BabarBilal AsyncPipeは、コンポーネントが破棄されるまでサブスクライブを解除しません。これはAngular AsyncPipeの文書に記載されています。 – Mantas

+0

ええ、ngOnDestroyで手作業で破壊する必要はありません。 –

答えて

0

主な理由は、asyncパイプを使用すると、コードがはるかにクリーンになります。

返されるデータが2つではなく数十または数百のキーで構成されているとします。すべての内部変数を設定するのは面倒です。

さらに、Angular docsによれば、AsyncPipeは、観測値によって最後の値が省略されます(これは、ビュー内の値を表示するのに最適な解決策です)。観察可能なもののトレースをXComponentに保存すると、すべての値、最初の値を取得し、あらゆる種類のデータ操作を行うことができます。

EDITは:

time = Observable.interval(1000).flatMap(() => new Date().toString()); 
+0

彼は非同期機能について質問しています –

+0

私は非同期なしで1つの変数だけを使用してテンプレートを作成できます千の鍵であなたが私に同意しない場合は、私に例を挙げてください。 – Akshay

+0

@Akshayはい、あなたはそれがより便利であり、そのようなアプローチで何も間違っていない場合、それを行うことができます。ただし、以前に発行されたデータ(最後のもの以外)が必要な場合や、カスタムロジックに基づいて一部の値のみを渡す場合など、クラス内のサブスクリプションに値を再割り当てするのではなく、オブザーバブルが必要です。単純に最後の値を取るのではなく、データ操作の柔軟性を高めるだけです。 – Mantas

関連する問題