我正在开发一个场景,我必须使用rest调用从springboot中检索对象列表,并使用angular 5将它们填充到UI中。
我的组件看起来像这样,
export class BusinessComponent implements OnInit {
serviceSavings:Services[] = [];
constructor(private ServicesService:ServicesService) {
}
ngOnInit() {
this.ServicesService.getServicesByCatID(PRODUCTSAVINGSID)
.subscribe(serviceSavings => this.serviceSavings = serviceSavings);
console.log("The length of serviceSavings :", this.serviceSavings.length); //this always prints zero.
}
examplemethod() {
console.log("The length of serviceSavings :", this.serviceSavings.length);
}
}
现在问题是init()方法中的日志语句打印了0行服务。我需要从列表中检索每个服务并对其执行一些操作。
当我放入用户定义的方法(例如在UI中使用用户操作调用它)时的相同日志。它会在数据库表中显示列表的确切计数数。
我需要在应用程序加载期间在init()中编写一些业务逻辑,以在UI中显示某些值。
但是在应用程序加载时,init()中重试列表的长度始终为0。我无法迭代价值观。我认为arrayobject存在一些更新问题。
我的服务方法如下所示,
getServicesByCatID(categoryid){
return this.http.get(this.getServiceUrlByCategory(categoryid))
.map(res => res.json());
}
springboot应用程序完全返回对象列表后端没有问题。
有人可以帮我找出问题吗?
答案 0 :(得分:2)
将您的控制台移到subscribe()
ngOnInit(){
this.ServicesService.getServicesByCatID(PRODUCTSAVINGSID)
.subscribe(serviceSavings => {this.serviceSavings = serviceSavings
console.log("The length of serviceSavings :", this.serviceSavings.length)
});
}
答案 1 :(得分:0)
您正在尝试在订阅完成之前获得结果,将其移至订阅内;如果要在视图中获取此数据,可以使用异步管道:
export class BusinessComponent implements OnInit {
serviceSavings : Observable<Services[]>;
constructor(private ServicesService: ServicesService){}
ngOnInit(){
this.serviceSavings =
this.ServicesService.getServicesByCatID(PRODUCTSAVINGSID);
}
您可以在视图中迭代您的数据:
<p *ngFor='let service of serviceSavings | async'></p>
答案 2 :(得分:0)
我有同样的问题,我得出结论,One应该写这个
this.ServicesService.getServicesByCatID(PRODUCTSAVINGSID)
.subscribe(serviceSavings => this.serviceSavings = [...serviceSavings]);
而不是this.serviceSavings = serviceSavings
并且以同样的方式,每次您希望向数组添加元素时,您最好写this.serviceSavings = [...serviceSavings, newServiceSaving]
而不是.push(newServiceSaving)