angular - 角 | 如何订阅对象数组的更改
问题描述
在我的角度应用程序中,我有以下对象数组:
public data = [
{a: 0, b: [{q: 1, z: 2}]}
{a: 1, b: [{q: 4, z: 9}]}
]
问题:如何订阅数组中的任何更改(也包括嵌套对象中的更改)?
预期结果:每次触发的函数都data
发生了变化
解决方案
首先,您需要一个服务来包装您的状态(在这里您也可以使用更复杂的框架,例如 Redux,但让我们一开始就保留它),这通常是解耦应用程序的好主意
状态服务.ts
import {BehaviorSubject, Observable} from "rxjs/index";
import {Injectable} from "@angular/core";
@Injectable({
providedIn: 'root',
})
export class StateService {
private readonly subject: BehaviorSubject<any> = new BehaviorSubject({});
public readonly observable: Observable<any> = this.subject.asObservable();
public set(newValue: any): void {
this.subject.next(newValue);
}
}
然后您的组件可以注册observable
以呈现它,例如通过使用
public readonly value: Observable<any> = this.stateService.observable
.pipe(map(_ => JSON.stringify(_)));
并例如打印出值
<p *ngIf="value | async">{{(value | async)}}</p>
如果您现在set
用于更新状态,组件将自动刷新。
一般来说,如果您的组件和应用程序状态正确分离(还记得 Model-View-Controller 吗?),我发现 Angular 应用程序更容易理解,因此您的组件本身不包含任何状态,并且仅通过以下方式将模板绑定到状态observables,这样您就不需要关心刷新和更新(还记得 Java Swing 侦听器吗?)。并且状态有一个明确定义的交互界面,因此没有人在你的应用程序状态的内部结构中摆弄。
推荐阅读
- postgresql - 如何使用标签标记变更集或变更日志文件 - webdevops/liquibase
- grails - 找不到构造函数“java.lang.String”的参数 0
- java - 如何确保 Java 线程永远不会运行无限循环?
- java - 如何在java中按右移?
- python - 为什么使用 while 循环可以使程序工作,但我原来的 for 循环不起作用?(DNA pset6)
- javascript - 查找最后一次说出一个词
- android - 无法解决 response.body().string() 的问题
- jupyter-notebook - Jupyter 中单元格之间的乳胶方程数重置为 1
- node.js - “npm install”安装不熟悉的文件
- c - 如何使用 Bash shell 脚本存储 C 程序的输出