我有一个子模块,尝试登录以检查角色。
this.auth.user$.subscribe(u => console.log(u)) // Child returning null
服务
private user: BehaviorSubject<User> = new BehaviorSubject<User> (null);
user$: Observable<User> = this.user.asObservable();
async getUser() {
try {
const { token, claims, expirationTime } = await (await this.afAuth.currentUser).getIdTokenResult(true);
const { name, email } = claims;
const expiry = Date.parse(expirationTime);
const authDetails = { token, name, email, expiry };
if (claims.claims && claims.claims.length === 1) {
const { groupId, role } = claims.claims[0];
this.user.next({ ...authDetails, groupId, role });
} else if (claims.claims && claims.claims.length > 1) {
this.user.next({ ...authDetails, allClaims: claims.claims });
}
return this.user;
} catch (err) {
throw err;
}
}
我已将Service作为提供者放在所有模块中
我在做什么错了?
答案 0 :(得分:1)
根据我对您的描述中以下一行的理解
我已将服务作为提供者放在所有模块中
由于您正在访问该服务的新实例,并且您需要一个singloton实例才能访问该值,因此这些信息无法正常工作。
我们要么这样做:-
@Injectable({
providedIn: 'root',
})
export class YourService {
}
或 仅在单个实例
的 Appmodule 的提供程序中添加服务所以, 我建议您尝试以上两种方法中的任何一种,这样对您来说一切都会奏效。
*删除所有模块提供程序阵列的服务。并使用 providedIn 方式或仅添加 AppModule 的提供程序。 那么您就拥有一个服务的单例实例,它将获得正确的行为主体和所有其他服务状态值。
答案 1 :(得分:0)
您的“种子”值为空。
如果您希望订阅时最后发出的值,但不需要提供种子值,请查看ReplaySubject! 来源:https://www.learnrxjs.io/learn-rxjs/subjects/behaviorsubject
所以只需使用:
private user: ReplaySubject<User> = new ReplaySubject<User>(1);
user$: Observable<User> = this.user.asObservable();
....