【发布时间】:2019-12-13 16:36:31
【问题描述】:
我有一个有两个孩子的父组件。
父组件有一个属性,实际上是这样的字典:
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);
}
这会打印0s,直到触发someFunctionInChildA,之后它会打印1s。
这是我的问题:孩子 B 似乎没有看到变化。这是孩子 B 的一些代码
@Input() dict: any;
ngAfterInit() {
setInterval(() => console.log(this.dict), 1000);
}
这会一直打印0s,即使在someFunctionInChildA 已被触发之后。
我不明白属性绑定的工作原理吗?还是更有可能我在其他地方有一个愚蠢或不相关的错误?
【问题讨论】:
-
如果您将间隔增加到 1500 毫秒,则在子 2 中...您看到 1 了吗?
-
除了
ngAfterInit不是任何形式的生命周期钩子之外,我认为这没有任何理由不可行……但在角度上下文中这是非常糟糕的做法。远距离的对象突变导致非常难以理解的代码和难以理解的错误。这就是您可能遇到的情况 -
@Ramesh 更改间隔不会改变任何内容。我发现了这个错误,因为它破坏了预期的行为。 setInterval 只是用于调试。
-
@bryan60 感谢您的提示。我有一堆属性,它们都与在组件之间传递的一件事有关,所以我认为我会很聪明,并将它们全部放入字典中。对于我的用例,有没有更好的方法来做到这一点。也许如果我将该字典保存在服务中并且所有需要了解它的组件直接与它交谈?也许使用 setter 和 getter 代替?
-
您应该使用服务和 rxjs 来共享对象并对其进行更改并通知其他组件
标签: angular typescript property-binding