使用Observable和HttpClient的Angular 5 GET数据 - 从Web API获取数据

时间:2018-04-02 23:20:46

标签: typescript httpclient observable angular5

关于如何使用带有HttpClient的Observable实现CRUD方法的新方法,在少数可用的Angular 5 Typescript文档中苦苦挣扎,我提出了下一个代码,但仍然坚持从Web API显示数据:

这是我的模特:

export interface Value {
    id: number;
    name: string;
  }

我的服务:

export class ValueService {
  baseUrl = environment.apiUrl;

  constructor(private authHttp: HttpClient) {}

  getValues() {
    return this.authHttp
      .get<Value[]>(this.baseUrl + 'values', { observe: 'response'});
      // here my baseUrl is 'http://example.com/api/'
  }
}

我的组件:

@Component({
  selector: 'app-values',
  templateUrl: './values.component.html',
  styleUrls: ['./values.component.css']
})
export class ValuesComponent implements OnInit {

  values: Value[];

  constructor(private valueService: ValueService, private route: ActivatedRoute) { }

  ngOnInit() {
    this.route.data.subscribe(data => {
      this.values = data['values'].result;
    });
  }
}

最后,我的模板:

<ul>
  <li>
    <div *ngFor="let value of values | async"> {{value.name}}</div>  
  </li>
</ul>

我的数据显示在浏览器控制台中,结果是HTTP 200,但不在我的页面上,我在网页上呈现它时缺少什么?

2 个答案:

答案 0 :(得分:4)

不确定为什么要调用activatedRoute,因为它不是指向ValueService的链接。你应该显式调用valueService来获取数据。

例如。在你的ngOnInit()

this.valueService.getValues().subscribe(response=> {
   // get your data here
});

另请查看您的ValueService.getValues()。这是一个适用于我们项目的简单实现。您可以稍后映射数组。

return this.http.get(url)
  .map((res: any) => res.json())
  .catch(error => Observable.throw(error.json()));

顺便说一句。不确定你的异步过滤器是什么。它做了什么?

答案 1 :(得分:2)

我不建议您使用ActivateRoute做什么,我建议将其与您获取数据方法分开。

您的getValues()方法将返回一个Observable,您将在组件中订阅该数据以将数据存储到values数组中。

您不应该使用|你在html ngFor循环中是异步的,除非你循环遍历一个Observable,但是在这种情况下你订阅了Observable并将数据存储到一个数组中。

服务:

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

@injectable()
export class ValueService {
  baseUrl = environment.apiUrl;

  constructor(private authHttp: HttpClient) {}

  getValues(): Observable<HttpResponse<Value[]>> {
    return this.authHttp
      .get<Value[]>(this.baseUrl + 'values', { observe: 'response'});    
  }
}

组件:

export class ValuesComponent implements OnInit {

  public values: Value[];

  constructor(private valueService: ValueService, private route: ActivatedRoute) { }

  ngOnInit() {
    this.valueService
        .subscribe(
            data => this.values = data['values'].result; // console.log your data to make sure its returning the expected results
            err => console.log(err);
         );
  }
}

HTML:

   <ul>
      <li>
        <div *ngFor="let value of values"> {{value.name}}</div>  
      </li>
    </ul>