【发布时间】:2020-06-20 21:51:04
【问题描述】:
我创建了一个 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吗?
【问题讨论】:
-
一开始为什么要使用 defer?你知道它的作用吗?
-
我的想法是
defer只会在观察者订阅它时创建 observable ...首先我有from然后我开始考虑defer但并不完全确定部分原因是我“只”将 Promise 转换为 Observable -
This 可以帮助您了解 defer 的工作原理以及应该如何使用它。
标签: angular rxjs observable angular9