将结果保存在 Angular 4 after http.get() 中的数组中
save results in an array in Angular 4 after http.get()
我使用 http.get() 从 api 中检索对象数组。每一项里面只有一个属性:"number"。我希望 属性 存储在我的 app.component 中的一个数组中。然后,我将使用该数组作为使用 chart.js 的图表的数据,目前可以正常工作。我已经尝试了一天多,但不知道该怎么做。你能告诉我吗?
app.component.ts
import { Component } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import 'rxjs/Rx';
import * as moment from 'moment';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app';
nrs: any;
count: any;
public listNrs: Array<number> = [];
private apiAllUrl: string = 'http://localhost:3000/api/all';
private apiCountUrl: string = 'http://localhost:3000/api/count';
//private apiBothUrl: string = 'http://localhost:3000/api/both';
constructor(private http:Http) {
let now = moment.locale("it");
}
ngOnInit() {
this.getAllNrs();
this.getCountNrs();
this.getDataNumbers();
//this.getCount();
//this.loadData();
}
getAllNrs() {
this.http.get(this.apiAllUrl)
.map((res:Response) => res.json())
.subscribe(
data => { this.nrs = data},
err => console.error(err),
() => console.log(this.nrs)
);
}
getCountNrs(){
this.http.get(this.apiCountUrl)
.map((res:Response) => res.json())
.subscribe(
data => { this.count = data},
err => console.error(err),
() => console.log(this.count)
);
}
getDataNumbers(){
}
//tried using jsonp
/*loadData() {
this.jsonp.get(this.apiAllUrl)
.map(res => res.json())
.subscribe(data => console.log(data));
}*/
/*getCount(){
this.getAllNrs();
for(let nr of this.nrs){
console.log(this.nrs.nr[1]);
}
}*/
newDate(days) {
return moment().add(days, 'days');
}
public lineChartData:Array<any> = [
{data: [4, 5, 56, -23, 4,], label: 'Indexer meta served links'},
];
public lineChartData1:Array<any> = [
{data: [-23, 4, 4, 5, 56], label: 'Indexer served links'},
];
public lineChartData2:Array<any> = [
{data: [4, 5, 4, 56, -23], label: 'Real-Time served links'},
];
public lineChartLabels:Array<any> = ['1 Lug 2017', '2 Lug 2017', '3 Lug 2017', '4 Lug 2017', '5 Lug 2017'];
public lineChartOptions:any = {
responsive: true,
/*
scales: {
xAxes: [{
type: 'time',
time: {
displayFormats: {
'millisecond': 'DD MMM',
'second': 'DD MMM',
'minute': 'DD MMM',
'hour': 'DD MMM',
'day': 'DD MMM',
'week': 'DD MMM',
'month': 'DD MMM',
'quarter': 'DD MMM',
'year': 'DD MMM',
}
}
}],
},
*/
};
public lineChartColors:Array<any> = [
{ // grey
backgroundColor: 'rgba(255,55,55,0.2)',
borderColor: 'rgba(255,55,55,1)',
pointBackgroundColor: 'rgba(255,55,55,1)',
pointBorderColor: '#fff',
pointHoverBackgroundColor: '#fff',
pointHoverBorderColor: 'rgba(255,55,55,0.8)'
},
];
public lineChartLegend:boolean = true;
public lineChartType:string = 'line';
// events
public chartClicked(e:any):void {
console.log(e);
}
public chartHovered(e:any):void {
console.log(e);
}
}
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpModule } from '@angular/http';
import { AppComponent } from './app.component';
import { ChartsModule } from 'ng2-charts/ng2-charts';
/*import { DataService } from './data.service';
import { DataComponent } from './data/data.component';*/
@NgModule({
declarations: [
AppComponent,
/*DataComponent*/,
],
imports: [
BrowserModule,
HttpModule,
ChartsModule
],
providers: [/*DataService*/],
bootstrap: [AppComponent]
})
export class AppModule { }
getAllNrs()
获取一个对象数组,其中每个对象都有一个 属性 命名数字。
getAllCount()
获取一个对象数组,其中每个对象都有一个 属性 命名计数。
问题是,即使我尝试将它映射到数组中,它也会告诉我 this.nrs
未定义且无法获取其长度(错误:Cannot read property 'length' of undefined
)。你知道为什么会这样吗?
如果您还需要什么,请告诉我,我会提供。
谢谢!
您可以使用 Array.map 将 array of object
转换为 array of string( or what ever)
。
var arrOfObj = [
{
number: 100
},{
number: 200
},{
number: 300
},{
number: 400
},{
number: 500
},{
number: 600
}
];
var arrOfStr = arrOfObj.map(function(item) {
return item.number;
});
console.log(arrOfStr);
正如我所说,您可以将 Array.map
部分直接添加到 http.get().map
中,但要确保 res.json()
实际上是 对象数组
this.http.get(this.apiAllUrl)
.map((res:Response) => res.json().map(item => item.number)) // convert here
.subscribe(
data => { this.nrs = data},
err => console.error(err),
() => console.log(this.nrs)
);
根据您的评论,您需要在构造函数中初始化所有属性,否则它将得到 undefined
。即使你给它一个类型,Typescript 也不能神奇地知道它的默认值。
export class AppComponent {
title = 'app';
nrs: any;
count: any;
public listNrs: Array<number> = [];
constructor(private http: Http) {
let now = moment.locale("it");
//initialize your values.
this.nrs = [];
this.count = 0;
}
//other codes
}
之后,您可以在 getAllNrs()
中使用 .map()
到 return 数字数组
getAllNrs() {
this.http.get(this.apiAllUrl)
.map((res: Response) => res.json())
.subscribe(
data => {
this.nrs = data.map(nrObj => nrObj.number)
},
);
}
我使用 http.get() 从 api 中检索对象数组。每一项里面只有一个属性:"number"。我希望 属性 存储在我的 app.component 中的一个数组中。然后,我将使用该数组作为使用 chart.js 的图表的数据,目前可以正常工作。我已经尝试了一天多,但不知道该怎么做。你能告诉我吗?
app.component.ts
import { Component } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import 'rxjs/Rx';
import * as moment from 'moment';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'app';
nrs: any;
count: any;
public listNrs: Array<number> = [];
private apiAllUrl: string = 'http://localhost:3000/api/all';
private apiCountUrl: string = 'http://localhost:3000/api/count';
//private apiBothUrl: string = 'http://localhost:3000/api/both';
constructor(private http:Http) {
let now = moment.locale("it");
}
ngOnInit() {
this.getAllNrs();
this.getCountNrs();
this.getDataNumbers();
//this.getCount();
//this.loadData();
}
getAllNrs() {
this.http.get(this.apiAllUrl)
.map((res:Response) => res.json())
.subscribe(
data => { this.nrs = data},
err => console.error(err),
() => console.log(this.nrs)
);
}
getCountNrs(){
this.http.get(this.apiCountUrl)
.map((res:Response) => res.json())
.subscribe(
data => { this.count = data},
err => console.error(err),
() => console.log(this.count)
);
}
getDataNumbers(){
}
//tried using jsonp
/*loadData() {
this.jsonp.get(this.apiAllUrl)
.map(res => res.json())
.subscribe(data => console.log(data));
}*/
/*getCount(){
this.getAllNrs();
for(let nr of this.nrs){
console.log(this.nrs.nr[1]);
}
}*/
newDate(days) {
return moment().add(days, 'days');
}
public lineChartData:Array<any> = [
{data: [4, 5, 56, -23, 4,], label: 'Indexer meta served links'},
];
public lineChartData1:Array<any> = [
{data: [-23, 4, 4, 5, 56], label: 'Indexer served links'},
];
public lineChartData2:Array<any> = [
{data: [4, 5, 4, 56, -23], label: 'Real-Time served links'},
];
public lineChartLabels:Array<any> = ['1 Lug 2017', '2 Lug 2017', '3 Lug 2017', '4 Lug 2017', '5 Lug 2017'];
public lineChartOptions:any = {
responsive: true,
/*
scales: {
xAxes: [{
type: 'time',
time: {
displayFormats: {
'millisecond': 'DD MMM',
'second': 'DD MMM',
'minute': 'DD MMM',
'hour': 'DD MMM',
'day': 'DD MMM',
'week': 'DD MMM',
'month': 'DD MMM',
'quarter': 'DD MMM',
'year': 'DD MMM',
}
}
}],
},
*/
};
public lineChartColors:Array<any> = [
{ // grey
backgroundColor: 'rgba(255,55,55,0.2)',
borderColor: 'rgba(255,55,55,1)',
pointBackgroundColor: 'rgba(255,55,55,1)',
pointBorderColor: '#fff',
pointHoverBackgroundColor: '#fff',
pointHoverBorderColor: 'rgba(255,55,55,0.8)'
},
];
public lineChartLegend:boolean = true;
public lineChartType:string = 'line';
// events
public chartClicked(e:any):void {
console.log(e);
}
public chartHovered(e:any):void {
console.log(e);
}
}
app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { HttpModule } from '@angular/http';
import { AppComponent } from './app.component';
import { ChartsModule } from 'ng2-charts/ng2-charts';
/*import { DataService } from './data.service';
import { DataComponent } from './data/data.component';*/
@NgModule({
declarations: [
AppComponent,
/*DataComponent*/,
],
imports: [
BrowserModule,
HttpModule,
ChartsModule
],
providers: [/*DataService*/],
bootstrap: [AppComponent]
})
export class AppModule { }
getAllNrs()
获取一个对象数组,其中每个对象都有一个 属性 命名数字。
getAllCount()
获取一个对象数组,其中每个对象都有一个 属性 命名计数。
问题是,即使我尝试将它映射到数组中,它也会告诉我 this.nrs
未定义且无法获取其长度(错误:Cannot read property 'length' of undefined
)。你知道为什么会这样吗?
如果您还需要什么,请告诉我,我会提供。 谢谢!
您可以使用 Array.map 将 array of object
转换为 array of string( or what ever)
。
var arrOfObj = [
{
number: 100
},{
number: 200
},{
number: 300
},{
number: 400
},{
number: 500
},{
number: 600
}
];
var arrOfStr = arrOfObj.map(function(item) {
return item.number;
});
console.log(arrOfStr);
正如我所说,您可以将 Array.map
部分直接添加到 http.get().map
中,但要确保 res.json()
实际上是 对象数组
this.http.get(this.apiAllUrl)
.map((res:Response) => res.json().map(item => item.number)) // convert here
.subscribe(
data => { this.nrs = data},
err => console.error(err),
() => console.log(this.nrs)
);
根据您的评论,您需要在构造函数中初始化所有属性,否则它将得到 undefined
。即使你给它一个类型,Typescript 也不能神奇地知道它的默认值。
export class AppComponent {
title = 'app';
nrs: any;
count: any;
public listNrs: Array<number> = [];
constructor(private http: Http) {
let now = moment.locale("it");
//initialize your values.
this.nrs = [];
this.count = 0;
}
//other codes
}
之后,您可以在 getAllNrs()
.map()
到 return 数字数组
getAllNrs() {
this.http.get(this.apiAllUrl)
.map((res: Response) => res.json())
.subscribe(
data => {
this.nrs = data.map(nrObj => nrObj.number)
},
);
}