0

这是我的数据服务:

private resultsChanged$: BehaviorSubject<Test[]> = 
                         new BehaviorSubject<any>([]);

constructor(private http: Http) { }

public getLatestTrends(): Observable<Test[]> {
    const latestUrl = `api/tests/trends/groupname=${this.group}&name=${this.team}`;
    return this.http.get(this.baseUrl + latestUrl)
        .switchMap((res) => {
        const json = res.json();
        console.log(json);
        this.resultsChanged$.next(json as Test[]);
        return json;
    });
}

public getSubject(): Observable<Test[]> {
    return this.resultsChanged$.asObservable();
}

这是使用 DataService 并格式化返回数据的组件:

private latestTests: Test[];
private subscription: Subscription;

constructor(private testDataService: TestDataService) { }

ngOnInit() {

  this.subscription = this.testDataService.getSubject()
      .subscribe((res) => {
          if (res === undefined || res.length < 1) {
              return;
          }

          this.latestTests = this.getFormattedTests(res.reverse());
      });
}

getFormattedTests(trends) {
    let formattedTests = [];

    if (trends === undefined || trends === null) {
        return formattedTests;
    }
    formattedTests = trends.map((trend) => {

        if (this.isPassed(trend.ran, trend.passed, trend.total)) {
            trend.state = 'check_circle';
            trend.color = 'green';
        } else {
            trend.state = 'warning';
            trend.color = 'red';
        }

        const ranPercent = this.getFixedPercent(trend.ran, trend.total);
        const passPercent = this.getFixedPercent(trend.passed, trend.ran);
        const failPercent = this.getFixedPercent(trend.failed, trend.ran);

        trend.notRun = trend.total - trend.ran;
        trend.ran = `${trend.ran} (${ranPercent})`;
        trend.passed = `${trend.passed} (${passPercent})`;
        trend.failed = `${trend.failed} (${failPercent})`;

        return trend;
    });

return formattedTests;

}

的HTML

<tr *ngFor="let test of latestTests">
      <td>
        <span><md-icon [ngStyle]="getStateOfBuild(test)">{{test.state}}</md-icon> {{test.versionString}}</span>
      </td>
      <td>{{test.total}}</td>
      <td>{{test.ran}}</td>
      <td>{{test.passed}}</td>
      <td>{{test.failed}}</td>
      <td>{{test.notRun}}</td>
      <td></td>
      <td>{{test.duration | duration }}</td>
 </tr>

好的,事情是这样的,当网站加载时,数据被格式化并保存在 latestTests 变量中。当我在我的路线之间循环以便再次调用 ngInit 时,数据会再次格式化,我不明白。奇怪的是,当我 console.log(json); 在 DataService 中,它会注销格式化的数据,而不是原始数据……这怎么可能?!就好像 BehaviorSubject 的数据以某种方式发生了变化。我错过了什么?

如果我需要澄清,请帮助和评论。

4

1 回答 1

0

注意 Subject 和 BehaviorSubject 之间的区别:

Subject的行为类似于事件总线,不保存数据。

BehaviorSubject可以充当事件总线,但也会在订阅时返回流中的最后一个值。

在您的服务中,您可以声明:

public mySubject = new BehaviorSubject(null);

现在您可以使用它来执行以下操作:

this.testDataService.mySubject.subscribe(
  res => console.log(res),
  error => console.log(error)
);
this.testDataService.mySubject.next('data');

就这样。我希望它有帮助

于 2017-08-23T09:28:58.233 回答