Angular 5 - HttpClient 服务 - 组件未获取数据
Angular 5 - HttpClient Service - Component not getting data
我正在使用 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() {
}
}
在控制台上它只是返回 'Undefined'
我做错了什么?
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() {
}
}
不要订阅服务,return observable 并在组件上订阅它。因为它是异步的,所以组件上的数据变量将是未定义的,因为您在 http 请求可以解析值之前分配。
关于服务:
getPosts() {
return this.http.get(`${this.ROOT_URL}/posts`);
}
在组件上:
ngOnInit() {
this.dataService.getPosts().subscribe(posts => this.posts = posts);
}
尝试以下代码片段。
您得到 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
您期望 return 值,但 return 什么都没有。您的 return 语句放置在嵌套 lambda 函数中,因此在您使用它的地方使用 "return" 会导致内部函数 return 一个值,而不是您需要的外部函数.
我建议您阅读 Angular.
中有关异步编程的内容,尤其是关于 Observable(基于 Promise 的相同概念)的内容
我基本上同意@Eduardo Vargas 的回答,但在解析器中执行此操作可能也是个好主意,它将调用 api,并将数据放入路由快照。由于这一点,它不会在空页面上等待在构造函数中订阅时加载数据。更多信息在这里:
https://blog.thoughtram.io/angular/2016/10/10/resolving-route-data-in-angular-2.html
我正在使用 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() {
}
}
在控制台上它只是返回 'Undefined'
我做错了什么?
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() {
}
}
不要订阅服务,return observable 并在组件上订阅它。因为它是异步的,所以组件上的数据变量将是未定义的,因为您在 http 请求可以解析值之前分配。
关于服务:
getPosts() {
return this.http.get(`${this.ROOT_URL}/posts`);
}
在组件上:
ngOnInit() {
this.dataService.getPosts().subscribe(posts => this.posts = posts);
}
尝试以下代码片段。
您得到 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
您期望 return 值,但 return 什么都没有。您的 return 语句放置在嵌套 lambda 函数中,因此在您使用它的地方使用 "return" 会导致内部函数 return 一个值,而不是您需要的外部函数.
我建议您阅读 Angular.
中有关异步编程的内容,尤其是关于 Observable(基于 Promise 的相同概念)的内容我基本上同意@Eduardo Vargas 的回答,但在解析器中执行此操作可能也是个好主意,它将调用 api,并将数据放入路由快照。由于这一点,它不会在空页面上等待在构造函数中订阅时加载数据。更多信息在这里:
https://blog.thoughtram.io/angular/2016/10/10/resolving-route-data-in-angular-2.html