angular - ngFor 不显示来自 Observable 事件源的数据

标签 angular rxjs observable ngfor eventsource

在我的 Angular6 应用程序中,我在使用异步 ngfor 显示数据时遇到了问题。我期待来自后端的一些服务器发送事件(只是带有答案字符串字段的对象)。虽然 console.log 显示来自服务的答案列表包含答案,但 ngfor 不显示任何内容。

这是我的组件:

import { Component } from '@angular/core';
import { Answer } from './answer';
import { AnswerReactiveService } from './answer-reactive.service';
import { Observable } from 'rxjs';

@Component({
  selector: 'app-answers',
  templateUrl: './answers.component.html',
  providers: [AnswerReactiveService],
  styleUrls: ['./answers.component.css']
})
export class AnswersComponent {
  answers: Observable<Answer[]>;

  constructor(private answerReactiveService: AnswerReactiveService) {
  }

  requestAnswerStream(): void {
    this.answers = this.answerReactiveService.getAnswerStream();
  }

}

这是服务:

import { Injectable } from '@angular/core';

import { Answer } from './answer';

import { Observable } from 'rxjs';

@Injectable()
export class AnswerReactiveService {

  private answers: Answer[] = [];
  private url: string = 'http://localhost:8080/events/1';

  getAnswerStream(): Observable<Array<Answer>> {
    return Observable.create((observer) => {
      let url = this.url;
      let eventSource = new EventSource(url);
      eventSource.onmessage = (event) => {
        console.log('Received event: ', event);
        const json = JSON.parse(event.data);
        console.log(json);
        this.answers.push(new Answer(json['answer']));
        console.log(this.answers);
        observer.next(this.answers);
      };
      eventSource.onerror = (error) => {
        if (eventSource.readyState === 0) {
          console.log('The stream has been closed by the server.');
          eventSource.close();
          observer.complete();
        } else {
          observer.error('EventSource error: ' + error);
        }
      };
    });
  }
}

和 HTML:

<div class="row">
  <div class="col-md-8">
    <p>
      <button (click)="requestAnswerStream()">Gimmie answers</button>
    </p>
    <ul>
      <li *ngFor="let answer of answers | async">{{answer.answer}}</li>
    </ul>
  </div>
</div>

最佳答案

经过一些研究,我通过使用 ngZone 获得了结果。我在这里发现了类似的问题:https://blog.octo.com/en/angular-2-sse-and-changes-detection/

现在我的服务代码看起来像这样并且可以正常工作:

      eventSource.onmessage = (event) => {
        this.zone.run(() => {
          console.log('Received event: ', event);
          const json = JSON.parse(event.data);
          this.answers.push(new Answer(json['answer']));
          observer.next(this.answers);
        });
      }; 

我只是想知道这个解决方案是否可以被视为完全响应式的? 我没有找到任何其他方法来完成这项工作。

关于angular - ngFor 不显示来自 Observable 事件源的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52655177/

相关文章:

css - 如何将水平滚动添加到 mat 自动完成

angular - 如何计算重试运算符是否执行了次数,是否发生错误异常

angular - 组件销毁并重新访问后,订阅在 ngOnInit 函数中运行

angular - 将您的 RxJS 主题暴露给 "safe"是不是 "outside world"

angular - 仅当第一个 Observable 返回 null 时如何调用第二个 Observable

javascript - 对正在馈送的可观察流进行单元测试的正确方法

Angular 2 Web Worker - UI 未运行

angular - ng-bootstrap DatePicker 在触发器 Angular 4 上设置 startDate 和 minDate

angular - http get请求Angular 6中的返回字符串

javascript - RxJS 的开关函数