2016-04-22 8 views
4

私は、ウェブ開発が変わっているという事実に慣れてきており、私はRxJSを手に入れる必要があります。私は現在Angular 2.0.0-beta.15を使ってWebアプリケーションを開発中です。RxJS科目とAngular2科目

私は最も優れたng-book 2に従っています(この種の広告は許可されていますか?まあ)。広範で浅いストロークでRxJSのいくつかの重要な概念をカバーし、さらに読むためのリンクを提供しています。私はソースコードとそれに付随する説明を読んで理解しましたが、とりわけSubjectに関するいくつかの詳細とAngular 2コンポーネントがこれらのSubjectストリームをどのように消費するかについて暗闇の中に少し残しています。

私は以下のようなものを本からコードを増強しています

export class SubmitResourceComponent { 
    private _newResourceTags: Subject<Tag> = new Subject<Tag>(); 
    private _resourceTags: Observable<Tag[]>; 
    private _tagUpdates: Subject<any> = new Subject<any>(); 
    private _create: Subject<Tag> = new Subject<Tag>(); 
    private _remove: Subject<Tag> = new Subject<Tag>(); 

    constructor() { 
     this._resourceTags = this._tagUpdates 
      .scan((tags: Tag[], operation: ITagsOperation) => operation(tags), initialTags); 

     this._create 
      .map((tag: Tag): ITagsOperation => (tags: Tag[]) => _.uniq(tags.concat(tag))) 
      .subscribe(this._tagUpdates); 

     this._remove 
      .map((tag: Tag): ITagsOperation => (tags: Tag[]) => _.without(tags, tag)) 
      .subscribe(this._tagUpdates); 

     this._newResourceTags.subscribe(this._create); 
    } 

    get resourceTags(): Observable<Tag[]> { 
     return this._resourceTags; 
    } 

    protected addTagToResource(tag: Tag): void { 
     this._create.next(tag); 
    } 

    protected removeTagFromResource(tag: Tag): void { 
     this._remove.next(tag); 
    } 
} 

をそして私はこのような_resourceTagsを消費しています:

<button class="btn" *ngFor="#tag of resourceTags | async" (click)="removeTagFromResource(tag)">{{ tag.name }}</button> 

私もの優れたサポートと、把握することはできませんどのようなgitter forumsは、UIが_resourceTagsSubjectにプッシュされたすべてのタグを表示する理由です。私はストリームがゴムパイプのようなものだと思います。一旦要素がSubjectにプッシュされ、Observer(この場合はUI要素)に公開されると、蒸発して消えませんか?それはストリーム/パイプ/ Subjectに残りますか? UIエレメントはSubjectにどのように登録されていますか?私は間違った方法でそれについて考えていますか?私は完全な精神的なリストラ/移植が必要ですか?

多くの質問があります。

答えて

6

nextに渡されたデータは、イベントのようなものです。放出された値を保つ加入者は値を取得し、Subjectによって作成されたObservableは(あなたがバッファする目的で、特別な演算子を使用する以外、または他の手段によって、それへの参照を保持しません。

| async角度が加入してObservableへ(Subject)、それはそれを表示する値を受信する

*ngForのみ配列をレンダリングあなたがSubject*ngForを使用する場合、被験体は配列を放出する必要がある。 - 各イベントは、単一の値が、値の配列ではなく、これらの値は*ngForによってレンダリングされ、Observableが新しい配列を出力します。

scan operator

あなたのコード例では、放出された値を蓄積し、これまでのところそれが*ngForによって必要とされるような新しいイベントを受信するたびに放出されたすべての値を含む配列を転送する目的でscan演算子を使用します。

+0

、あなたがにリンクする必要があります['scan'](http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-scan)のRxJS 5ドキュメント。 – Dorus

+0

Ok、完了です。ヒントをありがとう。 –

+0

"With | async AngularはObservable(Subject)にサブスクライブし、値を受け取ると表示します。 - 「コレクション」が変更されるたびに、タグを追加または削除することによって、すべてのタグがAngularコンポーネントにプッシュされると仮定していますが、そうですか?そうしないと、タグを削除できず、このコードが正しく機能しています。私は、副作用がいつ発生しているのか、そしてコレクションが何をしているのかを正確に見るために、たくさんのログを作成する必要があると思います。 – serlingpa

1

私はobservablesが、入力ボックスから値を取得するために変数を設定する方法と同じように、セッションがクリアされるまで、ブラウザのメモリに変数の値を格納すると思います。空になる。上記のシナリオでは、私は、ブラウザがリフレッシュ/リロードのデフォルトの動作を防止することができる最もSPAのように思うだろうし、あなたが値として積み上げを続け

... _.uniq(tags.concat(tag))).subscribe(this._tagUpdates);... 

のような操作を行うときは、その持続性のいくつかの並べ替えを取得し、それら作成したイベントでconcated「再しかし、私は間違った質問を得たが、私は何を意味することはこれです多分

EDIT

セッションをページ上で手動でリフレッシュが発生したときに消えるとクリアになります。 _resourceTagsは空を開始します、値はcreateです作成したイベントによってD、今_resourceTagsある[newValueに#1]角度検出を変更し、ngForを使用して再表示する_resourceTags、新しいイベントを作成_resourceTags後には今ある[newValueに#1、 newValue#2]両方の角度を示すrerendersが表示されます。ストリームはfirebaseか、それが空の状態に戻りますブラウザに_resourceTagsをリロードすると意味しますwebsqlなどのオフラインのようなオンラインデータベースに永続化されていない場合、これはRxJS 5を使用しているため

+0

どういうわけかこの答えは質問に関連していないようです。 –

+0

ああ申し訳ありませんが、値が消えない可能性があることを知りたいと思っていた –

関連する問題