2017-04-06 17 views
0

我嘗試做一個簡單的服務來管理我的應用程序中的單個狀態:加載器的可見性。簡單的狀態服務不需要的複雜性

這些更改將由某些組件發出,主佈局組件將訂閱它以監視布爾值更改。然後通過簡單的ngIf進行處理。

下面是代碼:

import { Injectable } from '@angular/core'; 
import { Observable } from 'rxjs/Rx'; 
import { Subject } from 'rxjs/Subject'; 

@Injectable() 
export class AppLoaderService { 
    private isLoaderVisible = new Subject<boolean>(); 

    changeLoaderState = this.isLoaderVisible.asObservable(); 

    emitChange(state: any) { 
    this.isLoaderVisible.next(state); 
    } 

} 

是我創建這個簡單的服務,爲一個簡單的toggler引入太多複雜的方法?

是否使用SubjectBehaviorSubject與我的情況有關?當我們想要發出這樣的更改或在服務初始化(BehaviorSubject)上設置默認值時,我發現了有關使用它們的必要性的一些信息。

但是在這裏也許有一個簡單的Observable就足夠了,但是如何處理價值變化呢?

回答

1

如果您唯一服務的是簡單的*ngIf,我看不到SubjectObservable。您可以使用簡單的boolean值作爲服務的屬性。也許是一個getter和一個setter,但是如果你沒有依賴關係必須對可見性變化作出反應,我不會使它與Observables複雜。

+0

請問我的佈局組件,使用這個布爾,能夠檢測到改變這種簡單的布爾?是否需要訂閱任何值(如可觀察的)才能觸發更改檢測? – BlackHoleGalaxy

+0

是的,因爲如果你改變這個變量,你很可能在所謂的「區域」工作。這是角度的美。您只需更改變量,模板立即作出反應。當然,如果你使用默認的'ChangeDetectionStrategy' – PierreDuc

1

你可以直接使用布爾值,只要你想顯示一個加載器,它就簡單得多。

public isLoaderVisible:boolean=false; 

讓我們在你的component.ts

export class AppComponent { 
    constructor(
    private loaderService: AppLoaderService 
){} 
... 

而在你component.html說

<div *ngIf="loaderService.isLoaderVisible"> 
    <!-- do something here -->