angular - 为什么我的输入绑定属性在我的 Angular 子组件中没有改变?
问题描述
我有一个有两个孩子的父组件。
父组件有一个属性,它实际上是一个像这样的字典:
dict = {a: 0, b: 0, c: 0};
我进行输入绑定,以便两个子组件都可以访问dict
.
<app-child-a [dict]="dict"></app-child-a>
<app-child-b [dict]="dict"></app-child-b>
孩子 A 改变了dict
@Input() dict: any;
someFunctionInChildA() {
this.dict.b = 1;
}
我可以验证父组件是否知道此更改。
ngAfterInit() {
setInterval(() => console.log(this.dict), 1000);
}
这会打印0
s 直到someFunctionInChildA
被触发,然后才会打印1
s。
这是我的问题:孩子 B 似乎没有看到变化。这是孩子B的一些代码
@Input() dict: any;
ngAfterInit() {
setInterval(() => console.log(this.dict), 1000);
}
这会一直打印0
s,即使在someFunctionInChildA
被触发之后也是如此。
我不明白属性绑定是如何工作的吗?还是更有可能我在其他地方有一个愚蠢或不相关的错误?
解决方案
正如你在这里看到的:https ://stackblitz.com/edit/angular-7-master-nxys2f?file=src/app/hello.component.ts
有问题的代码工作正常。但是..这是一个非常糟糕的做法。因为这种远距离突变会导致难以推理代码和难以理解的错误。我猜你的真实应用程序有点复杂,你可能不小心在某处破坏了引用。这就是为什么您应该使用共享服务模型和 rxjs 在组件之间共享信息的原因:
@Injectable()
export class DictService {
private dictSource = new BehaviorSubject({a: 0, b: 0, c: 0})
dict$ = this.dictSource.asObservable()
setDict(dict) {
this.dictSource.next(dict)
}
}
然后注入您的组件并订阅:
constructor(private dictService: DictService) {
this.dictSub = this.dictService.dict$.subscribe(dict => this.dict = dict) // don't forget to unsubscribe!
}
并使用该服务更新:
someFunctionInChildA() {
this.dict.b = 1;
this.dictService.setDict(this.dict)
}
推荐阅读
- android - 发布版本中未安装本机库
- python - 如何检查输入值是否为有效字符串?
- google-apps-script - 替换后在 gDoc 中居中
- parsing - 条件格式 XSL
- google-cloud-firestore - 如何更新firestore中的对象数组?
- android - 如何在获取 JSON 数据期间显示进度
- javascript - 尽管函数执行正确,但“将循环结构转换为 JSON”错误
- node.js - 在 WebStorm 2019.2 中同时调试 Node.js 服务器和 React 客户端:断点不会“中断”?
- java - 从另一个同步方法调用同步方法,两者都在不同的对象上
- sql - 如何用SQL找出加入闰年的员工