2016-08-22 42 views
1

我有一个组件和一个服务。每当我的服务中的布尔属性发生更改时,我都想通知我的组件。我想我应该使用rxjs中的Observable和Observer。监视angular2中服务和更新组件的更改,打印稿

我做了服务和组件不按预期工作。

AppComponent.ts

import { Component } from '@angular/core'; 
import { UserData } from 'user-data.service'; 
@Component({ 
    selector: 'app', 
    templateUrl: '<div></div>' 
}) 
export class AppComponent { 
    isLoggedIn: boolean; 
    constructor(public userData: UserData) { 
     userData.isLoggedIn.subscribe(isLoggedIn => { 
      this.isLoggedIn = isLoggedIn; 
     });//??? 
    } 
    ??? 
} 

UserDataService.ts

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

@Injectable() 
export class UserData { 
    isLoggedIn: Observable<boolean>; // ??? 
    observer: Observer<boolean>; // ??? giving an error in tsc (Type 'Observer' is not generic) 
    constructor() { 
     this.isLoggedIn = new Observable(observer => 
      this.observer = observer 
     ).share(); ///??? 
    } 
    changeLoginStatus (isLoggedIn: boolean) { // function called from login/logout actions 
     this.observer.next(isLoggedIn); // ??? not sure 
    } 

}

回答

1

最简单的方法是使用一个带有BehaviorSubject初始值:

export class UserData { 
    isLoggedIn: Subject<bool> = new BehaviorSubject(false); 
    changeLoginStatus (isLoggedIn: boolean) { 
    this.isLoggedIn.next(isLoggedIn); // ??? not sure 
    } 
} 

参见https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service

由于@KonradGarus建议的,Subject应当保密。

export class UserData { 
    private isLoggedIn: Subject<bool> = new BehaviorSubject(false); 
    isLoggedIn$ = this.isLoggedIn.asObservable(); 
    changeLoginStatus (isLoggedIn: boolean) { 
    this.isLoggedIn.next(isLoggedIn); 
    } 
} 

上面还挂菜谱包含一个完整的例子,其中Subject将保密。

+0

下一个方法是在Observer类型上,而不是在Observable上 – lintu

+0

对不起,请将类型更改为'Subject'。 –

+0

当我尝试使用新的BehaviorSubject(false);我在rxjs上获得了404。 http:// localhost:8080/node_modules/rxjs/404(Not Found)。但我可以使用rxjs中的'Subject'。 从'rxjs'导入{BehaviorSubject};从'rxjs/Subject'导入{Subject}时抛出错误;作品。任何想法?? – lintu