为什么我的输入绑定 属性 在我的 angular child 组件中没有改变?
Why isn't my input bound property changing in my angular child component?
我有一个 parent 组件有两个 children.
parent 组件有一个 属性,它实际上是一个像这样的字典:
dict = {a: 0, b: 0, c: 0};
我进行输入绑定,以便 child 两个组件都可以访问 dict
。
<app-child-a [dict]="dict"></app-child-a>
<app-child-b [dict]="dict"></app-child-b>
ChildA变属性 of dict
@Input() dict: any;
someFunctionInChildA() {
this.dict.b = 1;
}
我可以验证 Parent 组件知道此更改。
ngAfterInit() {
setInterval(() => console.log(this.dict), 1000);
}
这会打印 0
秒,直到 someFunctionInChildA
被触发,然后它会打印 1
秒。
这是我的问题:child B 似乎没有看到变化。这是来自 child 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)
}
我已经解决了这个问题,我怀疑其他人会发现它有用,因为这是一件很少见的事情...
几天前,我实际上做了一个服务,可以将 dict
保存并更新到 Firebase 中,这将通过 rxjs 与我的组件同步。但我留下了一些旧逻辑(即 dict
由组件而不是服务管理的逻辑)。
我会将其标记为正确答案,但真正的功劳归功于@bryan06,他对此类应用程序的正确模式进行了很好的解释。
我有一个 parent 组件有两个 children.
parent 组件有一个 属性,它实际上是一个像这样的字典:
dict = {a: 0, b: 0, c: 0};
我进行输入绑定,以便 child 两个组件都可以访问 dict
。
<app-child-a [dict]="dict"></app-child-a>
<app-child-b [dict]="dict"></app-child-b>
ChildA变属性 of dict
@Input() dict: any;
someFunctionInChildA() {
this.dict.b = 1;
}
我可以验证 Parent 组件知道此更改。
ngAfterInit() {
setInterval(() => console.log(this.dict), 1000);
}
这会打印 0
秒,直到 someFunctionInChildA
被触发,然后它会打印 1
秒。
这是我的问题:child B 似乎没有看到变化。这是来自 child 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)
}
我已经解决了这个问题,我怀疑其他人会发现它有用,因为这是一件很少见的事情...
几天前,我实际上做了一个服务,可以将 dict
保存并更新到 Firebase 中,这将通过 rxjs 与我的组件同步。但我留下了一些旧逻辑(即 dict
由组件而不是服务管理的逻辑)。
我会将其标记为正确答案,但真正的功劳归功于@bryan06,他对此类应用程序的正确模式进行了很好的解释。