2016-10-07 14 views
2

私はLoginServiceにisLoggedInブール型の値BehaviorSubjectを実装し、getterとsetter関数を使ってObservableとして値を取得する/変数を正しく設定することを試みていますBehaviorSubject。これは動作していますが、TSLintでは「型が割り当てられません」と「Dublicate識別子」について2つのエラーが発生します。 TSLintなしでそれを定義する正しい方法は何であろうかと不平を言います。getterとsetterをAngular 2で実装する方法

これは、上記のコードのストリップダウンバージョンです:あなたは活字体getter/setterを使用する場合

@Injectable() 
export class LoginService { 
    public isLoggedInSource = new BehaviorSubject<boolean>(false); 
    public isLoggedIn: Observable<boolean> = this.isLoggedInSource.asObservable(); // Duplicate identifier 'isLoggedIn'. 

    constructor(private http: Http) {} 

    set isLoggedIn(logged): void { // Duplicate identifier 'isLoggedIn'. 
    this.isLoggedInSource.next(logged); 
    } 

    get isLoggedIn(): Observable<boolean> { // Duplicate identifier 'isLoggedIn'. 
    return this.isLoggedInSource.asObservable(); 
    } 

    logout() { 
    this.isLoggedIn = false; // Type 'boolean' is not assignable to type 'Observable<boolean>'. 
    } 

    login(body) { 
    return this.http.post('/login', body) 
     .map(res => { 
       if (res.token) { 
        this.isLoggedIn = true; // Type 'boolean' is not assignable to type 'Observable<boolean>'. 
       } 
       return res; 
       }) 
     .catch(err => Observable.throw(err);); 
    } 
} 
+2

プロパティとgetter /セッターのために異なる名前を使用します。 – toskv

+0

...パブリックプロパティのゲッター/セッターを持っていることには、実際にはポイントがありません。あなたのクラスのユーザーはとにかく周りを回ることができます。 – toskv

答えて

5

は、あなたがあなたの財産の名前を変更する必要があり、そのプロパティ名がgetters/setters名から異なっている必要があります。

さらに、サービスのプライベートメンバーとしてbehaviorSubjectを設定してコードを変更し、Observableを公開することができます。

@Injectable() 
export class LoginService { 

    private isLoggedInSource = new BehaviorSubject<boolean>(false); 

    public _isLoggedIn: Observable<boolean> = this.isLoggedInSource.asObservable(); 

    constructor() {} 

    set isLoggedIn(logged: boolean) { 
    this.isLoggedInSource.next(logged); 
    } 

    get isLoggedIn() { 
    return this._isLoggedIn; 
    } 

    logout() { 
    this.isLoggedIn = false; 
    } 

    login() { 
    this.isLoggedIn = true; 
    } 

} 

そして、あなたはあなたの成分の変化を聞くことができるようになります:

export class App { 
    constructor(private loginService: LoginService) { 

    loginService.isLoggedIn.subscribe(bool => console.log(bool)); 

    //Wait and simulate a login 
    setTimeout(() => { 
     loginService.login(); 
    }, 1200); 

    } 
} 
+0

このパターンを使ってエラー処理をどのように解決しますか? – martinoss

+0

サービスレイヤでエラーを処理できます。しかし、 'new Error()'のようなものをサブジェクトストリームに送ることはできません。 **データ生成フロー**と**データストア**の2つの部分にアーキテクチャを分割する必要があります。この[post](https://stackoverflow.com/questions/41827371/how-do-i-throw-an-error-on-a-behaviour-subject-and-continue-the-stream)を参照することができます。 –

関連する問題