状态更改未通过组件中的订阅获取

时间:2016-11-12 14:13:51

标签: angular state ngrx

我使用ngrx在Angular2应用程序中提供状态管理。我有两个组件:" MenuComponent"和" ResultsPanelComponent"订阅由同一片状态提供的不同值。

我看到的问题是"菜单"组件响应状态变化,但结果"结果"当我记录状态值时,组件不会。

我将调度操作以在更高阶的组件中填充状态。

// menu.component.ts
export class MenuComponent implements OnInit, OnDestroy {
  private sub: Subscription;
  newReportHeaderCount: number;

  constructor(
    private store: Store<AppState>,
  ) { }

  ngOnInit(): void {
    this.sub = this.store.select('results').subscribe((state) => {
      console.log('MenuComponent state: ', state);
      this.newReportHeaderCount = state['newReportHeaderCount'];
    });
  }

  ngOnDestroy(): void {
    this.sub.unsubscribe();
  }
}

// results.component.ts
export class ResultsPanelComponent implements OnInit, OnDestroy {
  private sub: Subscription;
  reportHeaderSummary: ReportHeaderSummary[] = [];

  constructor(
    private store: Store<AppState>,
  ) {}

  ngOnInit(): void {
    this.sub = this.store.select('results').subscribe((state) => {
      console.log('ResultsPanelComponent state: ', state);
      this.reportHeaderSummary = state['reportHeaderSummary'];
    });
  }

  ngOnDestroy(): void {
    this.sub.unsubscribe();
  }
}

当我运行我的应用程序时,我看到了:

MenuComponent state:  Object {reportHeaderSummary: Array[0], reportHeaders: Array[0], newReportHeaderCount: 0, loading: false}
ResultsPanelComponent state:  Object {reportHeaderSummary: Array[0], reportHeaders: Array[0], newReportHeaderCount: 0, loading: false}
MenuComponent state:  Object {reportHeaderSummary: Array[4], reportHeaders: Array[0], newReportHeaderCount: 3, loading: false}

登录到控制台。当状态发生变化时,我希望再看到ResultsPanelComponent state的另一个日志语句。

ResultsPanelComponentMenuComponent位于不同的模块中,但两者都包含在调度操作以加载数据的同一父模块中。

[更新]

我做了一个额外的操作来增加newReportHeaderCount值,当从MenuComponentResultsPanelComponent调度时,状态是正确的,但新值不会推送到所有组件订阅results状态切片。

我只在调度操作的组件中看到新的状态值。

如果我将操作的调度移动到更高阶的组件,我只会在MenuComponent

中看到状态更改

关于我可能做错的任何想法?

1 个答案:

答案 0 :(得分:0)

我在一个模块中加载了我的EffectListener和provideStore,这个模块在其他几个模块中共享。

我把它们移到我的根 success:function(data){ alert(data.email); } ,一切都按预期工作。