我试图在一个Angular应用程序中订阅一个TypeScript装饰器中的RxJS observable。
具体来说,我尝试创建一个@OnLogin()
装饰器,当auth服务从login$$
主体(公开为login$
)发出时,它会导致服务中的一个方法执行。
授权服务:
// value doesn't matter, only that a login occurred
private login$$ : BehaviorSubject<void>;
get login$() : Observable<void> {
return login$$.asObservable();
}
下面是装饰器的定义(不工作):
export function OnLogin() {
return function(target : any, propertyKey: string, descriptor: PropertyDescriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args : any[]) {
const authService : AuthService = AppModule.injector.get<AuthService>(AuthService);
if (authService) {
console.warn("Auth service found");
} else {
console.warn("No auth service found");
}
authService.login$
.subscribe(() => {
originalMethod.apply(this, args);
});
}
return descriptor;
}
}
注入器作为AppModule的静态成员公开:
app.module.ts:
export class AppModule {
static injector : Injector;
constructor(injector : Injector) {
AppModule.injector = injector;
}
}
在一个使用装饰器的服务中,我希望调用看起来像这样:
@OnLogin()
doLogin() : void {
// initialize items that need to do so on login
}
不幸的是,descriptor.value
内部的装饰器函数根本没有执行,装饰函数也没有执行。我的一个想法是,我没有在对originalMethod.apply()
的调用之前返回。但由于这只发生在$login
发出时,这是正确的管理方法吗?
1条答案
按热度按时间kiayqfof1#
下面是代码的更新版本:
认证服务:
更新装饰: