angular - 为什么在带有异步管道的 Angular 模板中未检测到 Subject.next () 发射?
问题描述
有以下代码,我想知道为什么 Subject.next(1)
在模板中看不到发射,而BehaviorSubject.next()
发射是可见的。
我知道将它包裹在里面可以setTimeout()
修复它,但我想理解它。
我似乎Subject.next()
是同步的,async
管道没有接收/标记检查。
@Component({
selector: 'my-app',
template: `
<div>Subj: {{ subj$ | async }}</div>
<div>BehavSubj: {{ behavSubj$ | async }} </div>
<div>Interval: {{ interval$ | async }} </div>
`,
styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit {
subj$ = new Subject<number>();
behavSubj$ = new BehaviorSubject<number>(1);
interval$ = interval(1000).pipe(take(100));
ngOnInit(): void {
this.subj$.next(1);
this.behavSubj$.next(2);
}
}
https://stackblitz.com/edit/angular-ivy-crnfgc?file=src/app/app.component.ts
解决方案
因为时间太早了,没有被发现。替换所有出现的OnInit
withAfterViewInit
并且它可以工作。
import { Component, AfterViewInit, OnInit, VERSION } from "@angular/core";
import { BehaviorSubject, interval, Subject } from "rxjs";
import { take } from "rxjs/operators";
@Component({
selector: "my-app",
template: `
<div>Subj: {{ subj$ | async }}</div>
<div>BehavSubj: {{ behavSubj$ | async }}</div>
<div>Subj: {{ subj2$ | async }}</div>
<div>BehavSubj: {{ behavSubj2$ | async }}</div>
<div>Interval: {{ interval$ | async }}</div>
`,
styleUrls: ["./app.component.css"]
})
export class AppComponent implements OnInit, AfterViewInit {
subj$ = new Subject<number>();
behavSubj$ = new BehaviorSubject<number>(1);
subj2$ = new Subject<number>();
behavSubj2$ = new BehaviorSubject<number>(1);
interval$ = interval(1000).pipe(take(100));
ngOnInit(): void {
this.subj$.next(1);
this.behavSubj$.next(2);
}
ngAfterViewInit(): void {
this.subj2$.next(1);
this.behavSubj2$.next(2);
}
}
首先,您必须初始化视图,以便异步管道已被订阅。然后你可以向一个简单的主题发送一个值。行为主体不同。它存储它的最后一个值。您可以先更新一个行为主题,然后再订阅。这也是你必须初始化行为主体但初始化基本主体没有意义的原因。
这是一个例子。
推荐阅读
- qr-code - 如何在二维码中编码 Ctrl 函数?
- python - 服务于 TensorFlow 预建的线性分类器估计器模型
- c# - 在哪里添加代码以根据来自另一个模型字段值的值填充数据库中模型字段的值
- jvm - 确定 String 是否为编译时常量
- sql-server - 使用 SQLServer 管理工作室收集累积的每周销售额
- html - 在 Firefox 中使用下拉菜单拖动问题轮播项目
- asp.net - 如果 ssrs 服务器是内部的,则在外部网站上呈现 ssrs 报告
- node.js - 在 react-admin 中更改语言环境的问题:语言包“隐式具有 'any' 类型”
- ios - 使用空字典调用 nw_dictionary_copy
- tcl - 在 Tcl 中循环调用进程和赋值