2017-07-20 59 views
3

我有一個目標構件的服務。主題提供了一類的一個實例:Angular> 2主題直接訂閱或使用方法?

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

主題的值與方法更新:

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

在幾類我訂閱的主題:

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

直接認購主體或向主體(可觀察)提供另一種方法是否是一種好的做法?

+1

如果你希望你的項目對象在您的應用程序的不同的地方共享,當你通過一個新的項目,以你的主題都它無處不在更新,那麼它要走的路。您不應該使用方法返回主體本身,只需訂閱它。 – Stanislasdrg

+0

感謝您的回答。 – hsc

+0

非常歡迎。 RxJS和觀測量往往遵循一種函數式編程範式,因此爲什麼你應該儘量避免getter和setter方法:-) – Stanislasdrg

回答

0

我在很多地方使用BehaviorSubject,我想從包含的主題,所以我通常做的所有科目下使用.value外服務的勸阻我的隊友:

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

但是,真的有是不是與訪問它,你擁有它,你可以隨時改變我的做法後,如果您需要它,甚至沒有通過只使用一個get訪問重構任何來電的方式備受關注。

+0

這是我困惑的原因。 A(行爲)主體是訂閱它的可觀察對象。然而,我的面向對象的背景說,這個類的成員應該封裝並暴露給一個getter和setter。但我可以想象這種方法在JavaScript RxJs中有所不同。 – hsc

+0

OO教授封裝,而不是getter和setter。一個類應該有一個公共API和一個私有API。 Java促進getter和setter,因爲它允許將來重構,而不是因爲它給你封裝。具有標準getter/setter的字段未被封裝。 如果您選擇的項目進行封裝?這取決於服務的目的。服務存儲您的應用的當前狀態並封裝您的應用的業務邏輯。組件負責顯示和I/O操作。 – Pace

+0

例如。也許你想讓頁面的一部分顯示當前選擇的項目名稱。如果你想封裝項目,那麼你應該創建一個名爲'selectedProjectName'或者類似的名稱的可見性。是否應該封裝當前選定的項目更加細微。如果選定的項目有10個字段,並且想要顯示所有這些字段,封裝選定的項目對象併爲所有字段創建getter將是愚蠢的。 – Pace