2017-06-05 66 views
2

我对angular2和rxjs相当陌生。我想创建一个angular2应用程序,会从jsonAPI一些数据,如何使用可观察数据每5秒刷新一次数据

我想获得的数据,每5秒, 我发现Observable.interval(5000)的解决方案,但我有一些错误,而编译,

如何在ngOnInit()代码中插入Observable.interval(500)代码

请!

import { Component, OnInit } from '@angular/core'; 

import { IProduct } from './product'; 
import { ProductService } from './product.service'; 

@Component({ 
    templateUrl: 'app/products/product-list.component.html', 
    styleUrls: ['app/products/product-list.component.css'] 
}) 
export class ProductListComponent implements OnInit { 
    pageTitle: string = 'Product List'; 
    imageWidth: number = 50; 
    imageMargin: number = 2; 
    showImage: boolean = false; 
    listFilter: string; 
    errorMessage: string; 

    products: IProduct[]; 

    constructor(private _productService: ProductService) { 

    } 

    toggleImage(): void { 
     this.showImage = !this.showImage; 
    } 

    ngOnInit(): void { 
     this._productService.getProducts() 
       .subscribe(products => this.products = products, 
          error => this.errorMessage = <any>error); 
    } 

    onRatingClicked(message: string): void { 
     this.pageTitle = 'Product List: ' + message; 
    } 
} 

productservice.ts

import { Injectable } from '@angular/core'; 
import { Http, Response } from '@angular/http'; 

import { Observable } from 'rxjs/Observable'; 
import 'rxjs/add/operator/do'; 
import 'rxjs/add/operator/catch'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/observable/throw'; 

import { IProduct } from './product'; 

@Injectable() 
export class ProductService { 
    private _productUrl = 'api/products/products.json'; 

    constructor(private _http: Http) { } 

    getProducts(): Observable<IProduct[]> { 
     return this._http.get(this._productUrl) 
      .map((response: Response) => <IProduct[]> response.json()) 
      .do(data => console.log('All: ' + JSON.stringify(data))) 
      .catch(this.handleError); 
    } 

    getProduct(id: number): Observable<IProduct> { 
     return this.getProducts() 
      .map((products: IProduct[]) => products.find(p => p.productId === id)); 
    } 

    private handleError(error: Response) { 
     // in a real world app, we may send the server to some remote logging infrastructure 
     // instead of just logging it to the console 
     console.error(error); 
     return Observable.throw(error.json().error || 'Server error'); 
    } 
} 
+0

为什么你删除了答案? – Sajeetharan

+0

我没有删除它! – user3264038

+0

你标记了我的答案,然后将其删除 – Sajeetharan

回答

2

确保您的服务这个样子的,你不会错过任何进口:

import 'rxjs/Rx'; 
import {Injectable} from '@angular/core'; 
import {Http} from '@angular/http'; 

    @Injectable() 
    export class ProductService{ 
     constructor(private _http:Http) {} 

     getData() { 
     return Observable.interval(5000).flatMap(() => { 
      return this._http.get(`URL GOES HERE`) 
      .map(res => res.json()); 
     }); 
     } 
    } 

在您的组件:

import { Component, OnInit } from '@angular/core'; 
import { ProductService } from './product.service'; 

export class ProductListComponent implements OnInit { 
    constructor(public _productService: ProductService) {} 

ngOnInit() { 
    this._productService.getData() 
     .subscribe(data => this.products = data, 
       err => console.log(err)); 
    } 
} 

这应该工作,但要确保你分享,你在控制台中看到你的问题是缺少的任何错误。

3

你需要你的ProductService.ts内修改如下,

getProducts(){ 
    Observable.interval(5000) 
     .flatMap(() => this.http.get(URL) 
     .map(res => res.json()) 
     .catch((error:any) => Observable.throw(error.json().error || 'Server error'))) 
     .subscribe(data => { 
     console.log(data) 
     }) 
} 
相关问题