如何更改我的自定义observable的值

时间:2016-11-25 08:39:00

标签: angular reactive-programming observable angularfire2

我正在开发angular2 fire身份验证,我已经设法以一种方式使身份验证工作,但我希望通过创建自己的自定义Observable以不同的方式执行它,但我无法做到这一点。

我登录了服务

constructor(private af: AngularFire) {}

signIn() {
    this.af.auth.login({
        provider: AuthProviders.Google,
        method: AuthMethods.Popup
    })
    return this.af.auth; // returns an observable which is consumed in an effect
}

使用此服务代码的效果:

constructor(private actions$: Actions, private authService: UserAuthService) {}

@Effect() 
login$: Observable<Action> =  this.actions$
    .ofType(UserAuthActions.ActionTypes.LOGIN)
    .switchMap(() => this.authService.signIn()) // <= switchMap takes the observable 
    // and takes care of subscribing to the observable 
    .filter(data => data !== null)
    .map((data) => {
        return {
            type: UserAuthActions.ActionTypes.LOGIN_SUCCESS,
            payload: {user: this.authService.getUserProfile(data)}
        }
    });

直到现在一切都很好,但我想如果我不想公开angularfire.auth observable,我想要公开我的自定义observable user$ = Observable.of(this.user),它包裹着一个用户对象, 可以通过订阅服务本身中的angularfire.auth observable来获取此用户对象。之后我可以更改observable user$的值,因为我公开了这个observable,switchMap中的Effect可以捕获它。

user: any = null;
user$: Observable<any>;

constructor(private af: AngularFire) {
    // Initializing the Observable
    this.user$ = Observable.of(this.user);
    this.af.auth.subscribe(
        // change the value of user property
        data => this.user = data // this should change the value of observable
    )
}

signIn() {
    this.af.auth.login({
        provider: AuthProviders.Google,
        method: AuthMethods.Popup
    })
    return this.user$;
}

但是这样做我可以在switchMap中捕获一次值,这就是构造函数运行的时候。

由于构造函数中的singIn()块运行并且更改了subscribe的值,我希望在调用this.user时也会更改它。

出于某种原因,useruser$的值没有改变,尽管理想情况应该如此。

我想我在这里遗漏了一些关于Observables的内容,任何人都可以帮助我实现它。在此先感谢!!!

0 个答案:

没有答案