1

因此,我在父视图之间共享了一些简单的同步本地数据,并且所有功能都很好,当本地数据更改时,所有使用它的父视图都会更新并正确反映。

然而,当我开始将我不断增长的项目拆分为自定义组件以防止代码重复和诸如此类的事情时,事情开始变得非常古怪。父组件仍然正常更新,但是尽管数据已绑定,但自定义组件子组件并未收到任何更改通知。此外,它只是父级之外的共享数据,父级本身的任何更改都会正常反映在视图上并按应有的方式更新。

就目前而言,当共享数据发生变化时,部分父组件发生变化,然后您必须单击页面以触发更改检测,这会导致大多数子组件突然获取单词并更新,但仍有一些不'没有得到这个词,所以你必须在父组件上稍微摆弄一下才能更新所有的视图,这很烦人。

我已经尝试过Tick()各种方法,ChangeDetectorRef也尝试过将它们置于不同的生命周期阶段,但我不知所措。

这是父组件上的一个子组件,它没有得到更新

<does-not-update [(ngModel)]='service.data.1'></does-not-update>

这是一个

<input type='number' [(ngModel)]='service.data.2'/>

如上所述,单击页面通常足以让孩子们投入使用并进行更新。

有一个组件稍微复杂一些,它自己有 2 个子节点,它将 ngModel 传递给一个子节点,并让该子节点将一些不同的数据传递给它的兄弟节点。所以它就像

parent -> child -> grandchild
                       |
                       V
                sibling grandchild

后者更复杂,尤其是不能正常工作,点击页面会更新孩子和孙子,但不会更新兄弟孙子

我如何理解这种混乱?

4

1 回答 1

0

我遇到了类似的问题,它与Angular 的变化检测有关。就我而言,我有一个父组件(应用程序),其中包含两个嵌套组件,表和过滤器。当用户在其中一个过滤器字段中键入时,组件会发出“filterChange”事件。父组件可以立即看到过滤器中的更改,但表格组件在他发生某些事件(例如单击)之前无法看到这些更改。我已经在父组件的 filterChange 处理程序中解决了这个调用 ChangeDetectorRef 的 detectChanges 的问题。

 update_filter($filter){
        this.requests_filter = $filter;
        this.cd.detectChanges();
      }
于 2018-12-13T13:38:37.150 回答