簡體   English   中英

Angular 9 中的組件之間共享數據

[英]Sharing data between components in Angular 9

我有一個帶有自定義庫( tools )的應用程序,其中包含許多要與應用程序中的其他項目共享的組件(我們稱其中一個為data-portal )。

在某些情況下,在data-portal app.component.html我有:

<div>
  ...
  <lib-primeng-menu-nav></lib-primeng-menu-nav>
  <router-outlet></router-outlet>
  ...
</div>

其中lib-primeng-menu-nav ,來自tools庫,包含項目的導航, router-outlet可以顯示幾個不同的視圖,其中一個顯示許多帶有時間序列數據的圖表(也來自tools庫): 時間序列圖表示例

當用戶單擊圖表左下角的星形圖標時,它應該將該系列從包含在“分析器”視圖中切換,其中可以在單個圖表上繪制多個系列以進行比較。 我在tools中有一個分析器服務,用於跟蹤應在分析器中顯示哪些系列。

返回導航欄,Analyzer 的鏈接還應顯示已選擇的系列數量的計數器:

<nav id="sidebar-nav" class="navbar navbar-fixed-top navbar-light">
  ...
  <a routerLink="/analyzer">&nbsp; Analyzer ({{analyzerSeries}})</a>
  ...
</nav>

這是我的問題:我無法讓櫃台改變。 在初始加載時,鏈接應顯示為Analyzer (0) ,但每當我單擊要添加的系列之一時,計數器保持為 0。如果我導航到 Analyzer 視圖,則顯示正確顯示正確的系列在圖表中,但導航欄仍然在計數器中顯示(0) 與分析器視圖和服務相關的所有其他行為似乎都可以正常工作。

這是我到目前為止所嘗試的:

方法一

分析器.service.ts

@Injectable({
  providedIn: 'root'
})
export class AnalyzerService {
  // Keep track of series in the analyzer
  public analyzerSeries = [];
  public analyzerData = {
    analyzerTableDates: [],
    analyzerSeries: [],
  };

primeng-menu-nav.component.ts

  constructor(
    private _analyzerService: AnalyzerService,
    private route: ActivatedRoute,
    private _router: Router
  ) { }
ngOnInit() {
    ...
    this.analyzerSeries = this._analyzerService.analyzerSeries.length;
    ...
  }

primeng-menu-nav.component.html

<nav id="sidebar-nav" class="navbar navbar-fixed-top navbar-light">
  ...
  <a routerLink="/analyzer">&nbsp; Analyzer ({{analyzerSeries}})</a>
  ...
</nav>

方法二

分析器.service.ts

  public analyzerSeries = [];
  private analyzerSeriesTest = new BehaviorSubject(null);
  analyzerSeries$ = this.analyzerSeriesTest.asObservable();
  ...
  updateAnalyzer(seriesId) {
    ...
    this.analyzerSeriesTest.next(this.analyzerSeries.length);
    ...
  }

primeng-menu-nav.component.ts

constructor(
    public _analyzerService: AnalyzerService,
    private route: ActivatedRoute,
    private _router: Router
  ) {
    this.analyzerSeriesCount = this._analyzerService.analyzerSeries$.subscribe((data: any) => {
      this.analyzerSeries = data;
    });
  }

這些都沒有奏效。 我還嘗試在服務中使用 EventEmitter 而不是 Behavior Subject 來讓組件訂閱,但我碰壁了。 我的預感是服務沒有正確提供,但我不完全確定。 我認為,

@Injectable({
  providedIn: 'root'
})

提供 singleton 服務,可在整個應用程序中使用。 我的任何模塊中都沒有將服務列為提供者。

終於想通了,所以想我會發布一個答案以防萬一。 我在導入data-portal app.module.ts 的tools庫中有一個額外的“ShareModule”以導入組件。 剛剛意識到這是不必要的,因為我可以只導入tools.module.ts ,並從導入中刪除 ShareModule 解決了我的計數器問題。 猜猜這是導致提供分析器服務出現問題的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM