Observableスタイルプログラミングの新機能です。私は質問がある:私は、コンポーネント間のアプリを介してユーザー情報を共有したい - と私はこの情報を共有するためにBehaviorSubjectを使用します。これは、AuthInfoとしてBehaviorSubjectを共有することによって影響を受けます。私のアプリケーションコンポーネントでuidを含むAuthInfoを共有できるのであれば、それを使って自分のユーザーオブジェクトデータを共有できますか?Observableをビヘイビアサブジェクトに簡単に変換または割り当てて他のコンポーネントがそれを共有できるようにする方法
問題は、ユーザーオブジェクトです、私はFirebaseから取得しています。それはObservableであり、どのようにこれをBehavior Subjectに割り当てることはできません。だからここに私がしようとしたコードです:
@Injectable()
export class AuthService {
static UNKNOWN_USER = new AuthInfo(null);
static EMPTY_USER = new User(null, null, null, null);
authInfo$: BehaviorSubject<AuthInfo> = new BehaviorSubject<AuthInfo>(AuthService.UNKNOWN_USER);
userInfo$: BehaviorSubject<User> = new BehaviorSubject<User>(AuthService.EMPTY_USER);
constructor(private auth: FirebaseAuth, private db:AngularFireDatabase, @Inject(FirebaseRef) fb) {
//firebase way to see if user is login or not
this.auth.subscribe(user => {
if (user) {
const authInfo = new AuthInfo(user.uid);
this.authInfo$.next(authInfo);
//This is the part I do not know how to do
[OPTION 1]: this.userInfo$.next(findUserByuid(user.uid)) ?? - error
[OPTION 2]: this.userInfo$ = findUserByuid(user.uid) ?? - userInfo$ turn into an observerable, which when I logout to call this.userInfo$.next(AuthService.EMPTY_USER) it will throw error as .next() is not a function.
[OPTION 3]:
this.findUserByuid(user.uid).subscribe(user => {
this.userInfo$.next(user);
});
---- Can I put a subscribe inside of another subscribe to chain it like promise? I am not sure this is following the best practices. But this is the only option that there is no error. But just not sure I am doing it right. I do get the user object no problem
}
else {
this.authInfo$.next(AuthService.UNKNOWN_USER);
}
});
}
findUserByuid(uid:string):any {
//return a firebase object observerable
return this.db.object('userProfile/' + uid).map(user => User.fromJson(user));
}
logout() {
this.userInfo$.next(AuthService.EMPTY_USER);
this.authInfo$.next(AuthService.UNKNOWN_USER);
this.auth.logout();
}
そして大きな疑問は、私が行動の対象を使用してアプリケーション間でデータを共有する必要がありますか?または、私はちょうどuser $ = findUserByuid(uid)のようなobservableを使って、User $をAuthServiceのメンバ変数として使うべきですか?そして、他のコンポーネントはユーザー$に加入していますか?
Angular1のようなダミーサービスを使わずに、Angular2でデータを共有するための最良の方法を非常に混乱しています。私はpplがBehavior Subjectを使って共有状態を共有するのを見ました。実装。どんな助けでも大歓迎です!行動主題に関してそこには多くのリソースがありません。
[UPDATE]:アプリケーション間で最良の方法2共有データは、それがReduxのを使っている私の意見で Behavior Subject VS regular Observable
こんにちは@Olsn、あなたは行動を使用するように提案していませんテーマ? this.authInfo $に初期値がなくても、他の新しいコンポーネントがauthInfo $とuserInfo $の最新の値を取得していない可能性があります。だから私は行動主題を使用する必要があります。ここでObservableだけを使用する理由を説明できますか? –
Afaik 'FirebaseAuth'は既にReplaySubjectですので、初期値がなければ' .startWith(null) 'を使うことができます。 – olsn
ありがとうございました。結合された質問。 FirebaseAuthがReplaySubjectであることをどのように知っていますか?あなたはそれを述べている場所に私を向けることができますか?また、データはfirebase.database.listと.objectを使ってReplaySubjectを取得しますか?私は.publishReplay(1).refCount();と仮定します。 this.authInfo $をキャッシュします。しかし、ユーザーログアウト時にauthInfo $が変更されます。だから私はその機能を失った。ユーザーログアウトと値が変更されたときにキャッシュを更新するにはどうすればよいですか?そして、これは行動の主題に変わることがありますので、私は理解しています。行動主題の例だけを学び、Repalyの主題については分かりません。ありがとう! –