我有一个来自docker的JSON服务。我想得到容器的数量。
所以我订阅了我的服务:
ngOnInit() {
this.docker.getContainers().subscribe(containers => {
console.log(containers.length);
});
}
我在控制台上得到了正确答案,但我得到了:
Object类型上不存在属性长度
我做错了吗?
export class DockerService {
private baseUrl:string = 'http://localhost:8080/api/docker';
private headers = new HttpHeaders({'Content-Type':'application/json'});
private options = new HttpHeaderResponse({headers:this.headers});
constructor(private _http:HttpClient) { }
getContainers() {
return this._http.get(this.baseUrl + "/containers", this.options);
}
getImages() {
return this._http.get(this.baseUrl + "/images", this.options);
}
}
答案 0 :(得分:3)
在声明var时,应使用(容器:任何[]):
ngOnInit() {
this.docker.getContainers().subscribe((containers: any[]) => {
console.log(containers.length);
});
}
答案 1 :(得分:2)
基本上,angular不知道http调用返回了哪种类型,因此它会将其自动转换为没有length
值的对象。为了使它能够工作,你必须将它强制转换为你所期望的,在你的例子中可能是一个容器数组。
getContainers(): Container[] {
return this._http.get<Container[]>(this.baseUrl + "/containers", this.options);
}
这种方式角度将知道期望什么,属性应该存在。这当然取决于您可能没有的Container
类。最干净的方法是创建这个类并将其属性定义为从后端返回的内容。
但是,如果由于某种原因你不想这样做,你可能只是告诉棱角分析你期望有一个any
数组,它不提供类型安全,但至少你是'得到你的length attribute
。
getContainers(): any[] {
return this._http.get<any[]>(this.baseUrl + "/containers", this.options);
}
答案 2 :(得分:0)
您应该映射您的回复,试试这个:
getContainers() {
return this._http.get(this.baseUrl + "/containers", this.options).map(res => {
return res.json();
});
}
getImages() {
return this._http.get(this.baseUrl + "/images", this.options).map(res => {
return res.json();
});
}
答案 3 :(得分:0)
由于默认情况下HttpClient以对象的形式获取响应,因此它没有那些属性。您可以将容器声明为 any [] 并访问length属性。
ngOnInit() {
this.docker.getContainers().subscribe(containers : any[] => {
console.log(containers.length);
});
}
因此,如上所述更改代码,它将起作用
答案 4 :(得分:0)
2019/3/24
Angular-7
我通过使用... Observable<any[]>
示例:
getContainers(): Observable<any[]> {
return this._http.get<any[]>(this.baseUrl + "/containers", this.options);
}
答案 5 :(得分:0)
Object 没有像 length 这样的属性,但是 object 有键值对,并且对象中的键是有限的,所以我们可以在对象的键上调用 length 属性。我尝试了以下方法,它对我有用。
ngOnInit() {
this.docker.getContainers().subscribe((containers: any[]) => {
console.log(Object.keys(containers).length);
});
}