我有一个JSON文件,其中包含待售属性列表。我试图使用* NgFor循环数据来创建一个列表。
首先,我仍然是角色和应用程序开发的业余爱好者所以我可能会误解文档等
我试过循环不同的路径
*NgFor="let post of posts.properties"
*NgFor="let post of posts.properties.property"
并且仍然遇到各种错误。
我的理解是,我必须将observable转换为一系列属性。然后将其绑定到html。 (我相信我做的属性是类型数组?
JSON
{
"properties": {
"property": [
{
"propertyID": "101552000007",
"branchID": "1",
"clientName": "A Demo",
"branchName": "Brackley",
"department": "Sales",
"referenceNumber": "10006",
"addressName": "",
"addressNumber": "87",
"addressStreet": "Hackney Road",
properties.interface.ts
export interface IProperties {
addressStreet: string;
addressNumber: number;
}
对于-sale.service.ts
import { IProperties } from './../properties.interface';
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class ForSaleService {
constructor(private http: HttpClient) {
}
getProperties(): Observable<IProperties[]> {
return this.http.get<IProperties[]>('/assets/data/jupix.json');
}
}
换sale.page.ts
import { ForSaleService } from './for-sale.service';
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-for-sale',
templateUrl: './for-sale.page.html',
styleUrls: ['./for-sale.page.scss'],
providers: [ForSaleService]
})
export class ForSalePage implements OnInit {
public properties = [];
constructor(private saleService: ForSaleService) { }
ngOnInit() {
this.onGetProperties();
}
onGetProperties() {
this.saleService.getProperties()
.subscribe(response => {
console.log(response);
this.properties = response;
});
}
}
HTML
<ion-content>
<ion-list *ngFor="let property of properties">
<ion-card>
<ion-card-header>{{ property.addressNumber }}</ion-card-header>
<ion-card-content>
<p>
<ion-icon name="person" color="primary"></ion-icon>
</p>
</ion-card-content>
</ion-card>
</ion-list>
</ion-content>
我不明白的是,属性属性是否绑定到属性数组?
编辑:尝试了一些建议后,控制台日志中的错误似乎出现了一种模式?它似乎看到未定义的子元素,因为这些是抛出错误的?
所以我将变量完全更改为propertiesList以使其更易于阅读。现在发生了一件非常奇怪的事情。所以我们有*ngFor="let property of propertiesList.properties.property"
然后为卡片图像<img src="{{ property.images.image[0].__text }}" alt="">
这是按预期工作,图像显示。但是在控制台日志Cannot read property '__text' of undefined
和原始的" Cannot read property 'property' of undefined
所以我继续在html中添加其他元素
<ion-card-header>{{ property.addressNumber }} {{ property.addressStreet }} {{ property.addressPostcode }}</ion-card-header>
这些工作正常,没有错误,数据显示。现在这是奇怪的地方。
<p>{{ property.propertyFeature1 }} {{ property.floorplans.floorplan._modified }}</p>
我现在加上这个,Cannot read property '__text' of undefined
消失了!而是用Cannot read property '__modified' of undefined
和原来的Cannot read property 'property' of undefined
代替
在visual studio代码中,我唯一得到的错误是Identifier 'properties' is not defined. 'Array' does not contain such a member
你可以试试这个
在循环之前检查*ngIf="properties.properties.property?.length > 0"
条件,以便检查数组或对象是否为空。
<ion-content *ngIf="properties.properties.property?.length > 0">
<ion-list *ngFor="let property of properties.properties.property">
<ion-card>
<ion-card-header>{{ property.addressNumber }}</ion-card-header>
<ion-card-content>
<p>
<ion-icon name="person" color="primary"></ion-icon>
</p>
</ion-card-content>
</ion-card>
</ion-list>
</ion-content>
所以你不会像Cannot read property 'property' of undefined
那样在控制台中出现任何错误
我希望这会有用。
来自docs:
如果
object
定义了它的迭代行为,那么它是可迭代的,例如在for ... of构造中循环的值。某些内置类型(如Array
或Map
)具有默认的迭代行为,而其他类型(如Object
)则没有。
将ngFor更改为以下内容:
<ion-list *ngFor="let property of properties.property">
然后你就可以迭代了,因为它是一个数组。
据我所知,get调用无法正确地将您的数据映射到您的Interface中定义的属性。由于映射不正确,因此不能是可以循环的正确数组。
根据您提供的所有变量,您需要通过以下方式循环:
<ion-list *ngFor="let property of properties.properties.property">
作为结果数组的属性,然后将属性作为json +属性的属性作为具有数据的实际数组...甚至不知道这两个相同的标识符是否会起作用