我有一串数据以Firebase的可观察流的形式进入。即在Angular2中汇总数据流
items: FirebaseListObservable<BucketlistItem[]> = [{
room: 'kitchen',
price: 200
}, {
room: 'kitchen',
price: 400
}, {
room: 'bedroom',
price: 400
}]
我想把它变成一个汇总列表,例如加起来类似房间的价格。
[{
room: 'kitchen',
price: 600
}, {
room: 'bedroom',
price: 400
}]
我已经实现了这一点,通过订阅可观察项目并在飞行中将其聚合以在条形图中显示它。但是,这看起来并不像最佳的解决方案,特别是在视图中经常更改items数组。有没有一种聪明的方式来使用observables来获得更强大的解决方案?
import {Component, Input, OnInit, Output, EventEmitter} from '@angular/core';
import {BucketlistItem} from "../../bucketlist/bucketlist-item";
import {FirebaseListObservable} from "angularfire2";
@Component({
selector: 'app-inspiration-header',
templateUrl: './inspiration-header.component.html',
styleUrls: ['./inspiration-header.component.css']
})
export class InspirationHeaderComponent implements OnInit, Input {
@Input() items: FirebaseListObservable<BucketlistItem[]>;
@Input() budget: string;
@Output() onBudget = new EventEmitter<string>();
public percentOfBudget: number;
public totalCost: number;
public barChartLabels: string[] = [];
public barChartData: any =
[{data: []}]
;
constructor() { }
ngOnInit() {
this.items
.subscribe(items => {
const aggregate = {};
let totalCost = 0;
for (const item of items) {
if (item.bucketed) {
totalCost += Number(item.price);
if (item.room in aggregate) {
aggregate[item.room] += Number(item.price);
} else {
aggregate[item.room] = Number(item.price);
}
}
}
this.setPercentageOfBudget(totalCost);
this.totalCost = totalCost;
for (const room in aggregate) {
this.barChartLabels.push(room);
this.barChartData[0].data.push(aggregate[room]);
}
this.barChartLabels = Object.keys(aggregate);
});
}
private setPercentageOfBudget(totalCost: number) {
this.percentOfBudget = Math.round(totalCost/Number(this.budget) * 100);
}
}
只有当所有数据都可用时才显示图表正确吗? – Aravind