Я создал директиву Angular 9, которая показывает элемент HTMl, только если пользователь аутентифицирован:
<div *authenticated>
Message for Members
</div>
И код директивы:
@Directive({
selector: '[authenticated]'
})
export class AuthenticatedDirective implements OnInit, OnChanges {
constructor(private template: TemplateRef<any>, private container: ViewContainerRef, private authenticationService: AuthenticationService) { }
ngOnInit() {
this.authenticationService.isSignedIn().subscribe(x => {
x ? this.container.createEmbeddedView(this.template) : this.container.clear();
});
}
ngOnChanges() {
this.authenticationService.isSignedIn().pipe(
distinctUntilChanged()
).subscribe(x => {
x ? this.container.createEmbeddedView(this.template) : this.container.clear();
});
}
}
Когда Я запускаю код и получаю сообщение об ошибке:
TypeError: observableFactory is not a function. (In 'observableFactory()', 'observableFactory' is an instance of ZoneAwarePromise) — defer.js:8
Я проверил метод authenticationService.isSignedIn()
, и у меня есть:
isSignedIn(): Observable<boolean> {
return defer(this.manager.getUser()).pipe(map((user: User) => !user.expired));
}
Метод this.manager.getUser()
возвращает Promise<User>
, поэтому я используйте defer
, чтобы вернуть Observable
.
Если я изменю defer
на from
, тогда он будет работать ...
Но не следует ли мне использовать defer
?