Object类型上不存在属性长度

时间:2018-05-15 13:23:03

标签: angular typescript

我有一个来自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);
  }
}

6 个答案:

答案 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);
    });
}