angular2 使用 sse 并创建 observable 然后解决获取值但组件没有结果

angular2 use sse and create observable then solve get value but component has no result

组件没有给出结果,为什么?创建 Observable 有什么问题吗?

//service.ts
import { Injectable } from '@angular/core';
import {Http, Response} from '@angular/http';
import {Observable} from 'rxjs/Rx';
import {EventSource} from '../../../lib/EventSource';
@Injectable()
export class SitestatService {
  constructor(private http: Http) {
  }
  getSiteStatInfo(opts): Observable<any> {
      let observable =  Observable.create(observer => {
        let eventSource = new EventSource(opts.url);
        eventSource.onmessage = x => {
          observer.next(x.data);
          console.log(x.data, '=================>data');
        };
      });
    return observable;

  }
}

///////////////////////////////////////////////////

//resolve.ts
import {ActivatedRoute, Router, Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import {Observable} from 'rxjs/Rx';
import {Injectable} from '@angular/core';
import {RequestOptions, Headers} from "@angular/http";
import {SitestatService} from "./sitestat.service";
@Injectable()
export class SitestatResolve {
  constructor(private sitestatService: SitestatService) {}
  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any>|any {
    let opts = {
      url: 'http://127.0.0.1:3333/sitestat'
    };
    // return opts;
    return this.sitestatService.getSiteStatInfo(opts);

//component
import {Component, OnInit} from '@angular/core';
import {SitestatService} from "./sitestat.service";
import {ActivatedRoute} from "@angular/router";
import {Observable} from "rxjs/Rx";

@Component({
    selector: 'app-sitestat',
    templateUrl: './sitestat.component.html',
    styleUrls: ['./sitestat.component.scss']
})
export class SitestatComponent implements OnInit {
    public currentTime: Date = new Date();
    public siteStatInfo: Object;

    constructor(private  sitestatService: SitestatService, public route: ActivatedRoute) {
        window.setInterval(() => this.currentTime = new Date()
            , 1000);
      }

    ngOnInit() {
      console.log(this.route.snapshot.data['sitestatInfo'], '==============>siteStatInfo');
      console.log(this.route.snapshot.data, '====================SitestatComponent');
    }

}
  }
}

不是我的想法,只是在一个法语博客上发现的,所以我只是翻译主要想法(来源:https://blog.octo.com/angular-2-sse-et-la-detection-de-changements/)。希望对你有帮助。

原因可能是 angular 在注册您的可观察对象时不会触发 DOM 刷新。实际上,ng 没有检测到 DOM 更改,因为通知是从 EventSource 内部完成的,而 ng 并不知道它。

为了解决它,您必须在 NgZone 的回调 运行 中调用 observer.next()

//service.ts
import { Injectable, NgZone } from '@angular/core';
import {Http, Response} from '@angular/http';
import {Observable} from 'rxjs/Rx';
import {EventSource} from '../../../lib/EventSource';
@Injectable()
export class SitestatService {
  constructor(private http: Http, private zone: NgZone) {
  }
  getSiteStatInfo(opts): Observable<any> {
      let observable =  Observable.create(observer => {
        let eventSource = new EventSource(opts.url);
        eventSource.onmessage = x => {
          this.zone.run(() => observer.next(x.data););
          console.log(x.data, '=================>data');
        };
      });
    return observable;

  }
}