因此,我在父视图之间共享了一些简单的同步本地数据,并且当本地数据更改使用它的所有父视图时,所有功能都可以正常更新和反映。
但是,当我开始将不断发展的项目拆分为自定义组件以防止代码重复时,事情开始变得非常古怪。父级仍正常更新,但是尽管绑定了数据,但自定义组件子级仍未收到任何更改通知。此外,它只是父级外部的共享数据,父级本身的任何更改都会正常反映在视图上,并按需更新。
就目前情况而言,当共享数据发生更改时,部分父项也会发生更改,然后您必须单击页面以触发更改检测,这将导致大多数子组件突然得到该单词并进行更新,但是仍然存在一些不了解的单词,因此您必须在父组件上稍作改动才能使所有视图更新,这很烦人。
我已经尝试过Tick()
和ChangeDetectorRef
中的各种方法,并且尝试将它们放在生命周期的各个阶段,但是我很茫然。
这是父级上的子级组件,无法获得更新
<does-not-update [(ngModel)]='service.data.1'></does-not-update>
这是一个可以做的
<input type='number' [(ngModel)]='service.data.2'/>
如上所述,单击页面通常足以使孩子适应和更新。
有一个组件稍微复杂一点,它本身有两个孩子,它将ngModel传递给一个孩子,并让那个孩子将一些不同的数据传递给同级。就像
parent -> child -> grandchild
|
V
sibling grandchild
后一种更复杂的方法尤其行不通,单击页面可更新子代和大子代,但不会更新兄弟姐妹的子代
我如何理解这个烂摊子?
答案 0 :(得分:0)
我也遇到过类似的问题,这与 Angular的更改检测有关。 就我而言,我有一个父组件(应用程序),其中包含两个嵌套组件:表和过滤器。当用户键入过滤器字段之一时,组件将发出“ filterChange”事件。父组件可以立即看到过滤器中的更改,但是表组件只有在发生某些事件(例如单击)之前才能看到这些更改。 我已经解决了在父组件中filterChange的处理程序中调用ChangeDetectorRef的detectChanges的问题。
update_filter($filter){
this.requests_filter = $filter;
this.cd.detectChanges();
}