未定义的可观察对象上的异步运算符
async operator on undefined observable
我有一个组件,仅当 observable
有数据时才显示信息。但是当我尝试在 observable
上使用 async
运算符时,我 没有看到 任何值。我对 async pipe 的工作方式感到困惑 我认为需要一些 时间来初始化 observable 在这种情况下 async pipe
不会对未定义的可观察对象执行任何操作,这就是组件未显示的原因。
@Component({
template: `
<div *ngIf="todo$ | async as todo">
<div {{todo.name}} </div>
</div>
`
})
export class TodosComponent implements OnInit, OnDestroy {
todo$: Observable<Todo>;
constructor(private store: Store<State>) {}
ngOnInit() {
this.todo$ = this.store
.pipe(select(selectTodos));
}
ngOnDestroy(): void {
}
}
我知道 async
管道将处理 Observable
但如果 Observable 仍然是 undefined 异步管道也会处理该场景。如果有,请注意我已经订阅并检查 observable 是否有数据。
你应该试试这个
<ul *ngIf="(todos$ | async).length">
<li *ngFor="let todo of todos$ | async">{{todo.name}}</li>
</ul>
首先你必须使用 *ngIf 然后你需要使用 for 循环来打印它
有几个代码问题。 @Wandrille 提到了第一个——您在模板中引用 todos
而不是 todo
。此外,{{todo.name}}
文本的开始 <div>
标记没有右尖括号。不过,我希望这些问题中的任何一个都会导致编译错误。您的代码与所列代码完全一致吗?
另一个可能的问题是您试图从数组中获取 name
元素(即,也许 todos$
应该是 Observable<Todo[]>
类型)。在这种情况下,您将需要调整类型声明(以及 selectTodos
选择器(如果适用))然后适当地进行迭代:
@Component({
template: `
<div *ngIf="todos$ | async as todos">
<div *ngFor="let todo of todos">
{{todo.name}}
</div>
</div>
`
})
export class TodosComponent implements OnInit, OnDestroy {
todos$: Observable<Todo[]>;
constructor(private store: Store<State>) {}
ngOnInit() {
this.todos$ = this.store
.pipe(select(selectTodos));
}
ngOnDestroy(): void {
}
}
异步管道也适用于多个延迟的和最初未定义的可观察对象。我做了一个 stackblitz 给你看:
您似乎从未从 select(selectTodos)
中获取任何数据
我有一个组件,仅当 observable
有数据时才显示信息。但是当我尝试在 observable
上使用 async
运算符时,我 没有看到 任何值。我对 async pipe 的工作方式感到困惑 我认为需要一些 时间来初始化 observable 在这种情况下 async pipe
不会对未定义的可观察对象执行任何操作,这就是组件未显示的原因。
@Component({
template: `
<div *ngIf="todo$ | async as todo">
<div {{todo.name}} </div>
</div>
`
})
export class TodosComponent implements OnInit, OnDestroy {
todo$: Observable<Todo>;
constructor(private store: Store<State>) {}
ngOnInit() {
this.todo$ = this.store
.pipe(select(selectTodos));
}
ngOnDestroy(): void {
}
}
我知道 async
管道将处理 Observable
但如果 Observable 仍然是 undefined 异步管道也会处理该场景。如果有,请注意我已经订阅并检查 observable 是否有数据。
你应该试试这个
<ul *ngIf="(todos$ | async).length">
<li *ngFor="let todo of todos$ | async">{{todo.name}}</li>
</ul>
首先你必须使用 *ngIf 然后你需要使用 for 循环来打印它
有几个代码问题。 @Wandrille 提到了第一个——您在模板中引用 todos
而不是 todo
。此外,{{todo.name}}
文本的开始 <div>
标记没有右尖括号。不过,我希望这些问题中的任何一个都会导致编译错误。您的代码与所列代码完全一致吗?
另一个可能的问题是您试图从数组中获取 name
元素(即,也许 todos$
应该是 Observable<Todo[]>
类型)。在这种情况下,您将需要调整类型声明(以及 selectTodos
选择器(如果适用))然后适当地进行迭代:
@Component({
template: `
<div *ngIf="todos$ | async as todos">
<div *ngFor="let todo of todos">
{{todo.name}}
</div>
</div>
`
})
export class TodosComponent implements OnInit, OnDestroy {
todos$: Observable<Todo[]>;
constructor(private store: Store<State>) {}
ngOnInit() {
this.todos$ = this.store
.pipe(select(selectTodos));
}
ngOnDestroy(): void {
}
}
异步管道也适用于多个延迟的和最初未定义的可观察对象。我做了一个 stackblitz 给你看:
您似乎从未从 select(selectTodos)