2017-07-20 3 views
3

私はSubjectメンバーとサービスしています。テーマは、クラスのインスタンスを提供する:Angular> 2 Subjectサブスクリプションを直接購読するか、またはメソッドを使用しますか?

public selectedProjectSubject: Subject<Project> = new Subject(); 

件名の値は方法で更新された:i被写体に加入いくつかのクラスに

public updateSelectedProject(project: Project) { 
    this.selectedProjectSubject.next(project); 
    } 

this.projectSubscription = this.projectService.selectedProjectSubject.subscribe((project: Project) => { 
     this.projectSelected = project; 
    }); 

Subjectに直接登録するか、Subject(Observable)に別の方法を提供するのがよい方法ですか?

私は多くの場所で BehaviorSubjectを使用して、私はそう、私は通常、すべての被験者のために次の操作を行い、被写体を含むサービスの .value外を使用してから、私のチームメイトを阻止したい
+1

あなたのプロジェクトのオブジェクトをあなたのアプリの異なる場所で共有して、新しいプロジェクトをあなたのサブジェクトに渡すときにどこでも更新されるようにしたい場合、それは行く方法です。メソッドを使用してサブジェクト自体を返すべきではなく、それをサブスクライブするだけです。 – Stanislasdrg

+0

答えをありがとう。 – hsc

+0

大歓迎です。 RxJSとObservablesは関数型プログラミングのパラダイムに従う傾向があります。そのため、セッターとゲッターを避けようとする理由: – Stanislasdrg

答えて

0

:本当に、そこしかし

private _selectedProject = new Subject<Project>(); 
get selectedProject(): Observable<Project> { 
    return this._selectedProject; 
} 

あなたがそれを持っているようにそれにアクセスすることにそれほど関心がありません。後でgetアクセサを使用するだけで呼び出し元をリファクタリングしなくても、後でいつでも自分のアプローチに変更できます。

+0

これは私の混乱です。 A(行動)サブジェクトはサブスクリプション可能です。しかし、私のOOの背景によれば、このクラスメンバはカプセル化され、getterとsetterで公開されるべきです。しかし、私はこのアプローチがJavaScriptのRxJでは異なっていると思います。 – hsc

+0

OOは、ゲッターやセッターではなく、カプセル化を教えています。クラスには公開APIとプライベートAPIが必要です。 Javaはgetterとsetterを促進します。なぜなら、将来のリファクタリングが可能になるからです。標準getter/setterを持つフィールドはカプセル化されません。 選択したプロジェクトをカプセル化する必要がありますか?それはサービスの目的によって異なります。サービスはあなたのアプリケーションの現在の状態を保存し、あなたのアプリケーションのビジネスロジックをカプセル化します。コンポーネントは、表示とI/O操作を担当します。 – Pace

+0

たとえば、ページの一部に、現在選択されているプロジェクト名を表示したい場合があります。プロジェクトをカプセル化したい場合は、 'selectedProjectName'という名前のような名前を公開するobservableを作成する必要があります。現在選択されているプロジェクトをカプセル化する必要があるかどうかは、さらに微妙です。選択したプロジェクトに10個のフィールドがあり、それらのすべてを表示したい場合は、選択したプロジェクトオブジェクトをカプセル化してすべてのフィールドのゲッターを作成することは愚かです。 – Pace

関連する問題