【问题标题】:Angular 5 - HttpClient Service - Component not getting dataAngular 5 - HttpClient 服务 - 组件未获取数据
【发布时间】:2018-06-17 14:01:56
【问题描述】:

我正在使用 Angular 5 并尝试从 JsonPlaceholder 获取一些数据。

首先我创建了服务,然后添加了:

import { HttpClientModule } from '@angular/common/http';

这是服务代码:

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class DataService {

  private ROOT_URL = 'http://jsonplaceholder.typicode.com';

  constructor(private http: HttpClient) {}

  getPosts() {
    this.http.get(`${this.ROOT_URL}/posts`).subscribe(data => {
      return data;
    });
  }

}

最后,在我的 app.component.ts 上:

import { Component, OnInit } from '@angular/core';
import { DataService } from '../../services/data.service';

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

  data;

  constructor(private dataService: DataService) {

    this.data = dataService.getPosts();
    console.log(this.data;
  }

  ngOnInit() {
  }

}

在控制台上它只是返回“未定义”

我做错了什么?

【问题讨论】:

  • 你需要订阅()
  • @MicheleDibenedetto 他做到了:)
  • 您的代码对我来说很好用。如果我console.log(data.json()),我会在我的控制台中得到一个包含 100 个对象的数组。您只需要使用data 而不是简单地返回它。
  • 哦,抱歉我没注意到 :)
  • @MicheleDibenedetto 该代码适用于console.log,但由于某种原因不适用于'return'

标签: javascript angular typescript angular-services angular5


【解决方案1】:

我基本上同意@Eduardo Vargas 的回答,但在解析器中执行它可能也是一个好主意,它将调用 api,并将数据放入路由快照中。多亏了这一点,它不会在空页面上等待在构造函数中加载订阅数据。更多信息在这里:

https://blog.thoughtram.io/angular/2016/10/10/resolving-route-data-in-angular-2.html

【讨论】:

    【解决方案2】:

    你期望一个返回值并且什么都不返回。您的 return 语句放置在一个嵌套的 lambda 函数中,因此在您使用它的地方使用“return”会导致内部函数返回一个值,而不是您需要的外部函数。

    我建议您阅读有关异步编程的内容,尤其是有关 Angular 中的 Observable(它基于相同的 Promise 概念)。

    【讨论】:

      【解决方案3】:

      import { HttpClientModule } from '@angular/common/http';
      //This is the service code:
      
      import { Injectable } from '@angular/core';
      import { HttpClient } from '@angular/common/http';
      
      @Injectable()
      export class DataService {
      
        private ROOT_URL = 'http://jsonplaceholder.typicode.com';
      
        constructor(private http: HttpClient) {}
      
        getPosts() {
        //if you want to use the observable which returns from .get()
        //.. you need to do "return"
         return this.http.get(`${this.ROOT_URL}/posts`);
        }
      
      }
       
      //app.component.ts:
      
      import { Component, OnInit } from '@angular/core';
      import { DataService } from '../../services/data.service';
      
      @Component({
        selector: 'app-root',
        templateUrl: './parent.component.html',
        styleUrls: ['./parent.component.css']
      })
      export class AppComponent implements OnInit {
      
        data;
      
        constructor(private dataService: DataService) {
      
          this.data = dataService.getPosts();
          //so if you want to use the value of your http call outside.. 
          //..of the service here is a good place where to do subscribe()
           this.data.subscribe(data => {
             console.log(this.data;
          });
        
        }
      
        ngOnInit() {
        }
      
      }

      【讨论】:

        【解决方案4】:

        试试下面的代码 sn-p。 您收到 undefined 是因为您在 http 请求可以解析值之前分配数据。从服务中删除订阅并将其移至组件。

        import { Injectable } from '@angular/core';
        
        import { HttpClient } from '@angular/common/http';
        
        @Injectable()
        export class DataService {
        
          private ROOT_URL = 'https://jsonplaceholder.typicode.com';
        
          constructor(private http: HttpClient) {}
        
          getPosts() {
            return this.http.get(`${this.ROOT_URL}/posts`);
          }
        
        }
        

        AppComponent.ts

        import { Component } from '@angular/core';
        import {DataService} from './data.service';
        @Component({
          selector: 'my-app',
          templateUrl: './app.component.html',
          styleUrls: [ './app.component.css' ] 
        })
        export class AppComponent  {
          constructor(public data:DataService){
        
            this.data.getPosts().subscribe(data=>{
              console.log(data);
            })
          }
        
        }
        

        在此处查看Demo

        【讨论】:

        • 也请看看我的回答。像上面的答案那样做,不在解析器中会导致进入页面后呈现数据的轻微延迟。
        【解决方案5】:

        不要订阅服务,返回 observable 并在组件上订阅它。因为它是异步的,所以组件上的数据变量将是未定义的,因为您在 http 请求解析值之前已分配。

        关于服务:

        getPosts() {
            return this.http.get(`${this.ROOT_URL}/posts`);
        }
        

        在成分上:

        ngOnInit() {
            this.dataService.getPosts().subscribe(posts => this.posts = posts);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-08
          • 1970-01-01
          • 2018-05-18
          • 1970-01-01
          • 2020-09-08
          • 2018-06-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多