【问题标题】:Error trying to diff 'object Object'. Only arrays and iterables are allowed NgFor尝试区分“对象对象”时出错。 NgFor 只允许使用数组和可迭代对象
【发布时间】:2019-04-03 22:45:06
【问题描述】:

我有一个 JSON 文件,其中包含待售物业列表。我正在尝试使用 *NgFor 循环遍历数据以创建列表。

首先,我仍然是 Angular 和应用程序开发的业余爱好者,所以我可能误解了文档等

我试过循环不同的路径

*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;
}

For-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');

  }

}

for-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>

我不明白的是,让properties的property绑定到properties数组?

编辑:在尝试了一些建议之后,控制台日志中的错误似乎出现了一种模式?似乎看到子元素未定义,因为这些是引发错误的元素?

所以我将变量完全更改为 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 中添加其他元素

&lt;ion-card-header&gt;{{ property.addressNumber }} {{ property.addressStreet }} {{ property.addressPostcode }}&lt;/ion-card-header&gt;

这些工作正常,没有错误,数据显示。现在这就是奇怪的地方。

&lt;p&gt;{{ property.propertyFeature1 }} {{ property.floorplans.floorplan._modified }}&lt;/p&gt;

我现在添加这个,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 &gt; 0"

标签: angular typescript api ionic-framework ngfor


【解决方案1】:

来自docs

如果object 定义了它的迭代行为,则它是可迭代的,例如在 for...of 构造中循环了哪些值。某些内置类型(例如 ArrayMap)具有默认的迭代行为,而其他类型(例如 Object)则没有。

将 ngFor 更改为以下内容:

<ion-list *ngFor="let property of properties.property">

那么你就可以迭代了,因为它是一个数组。

【讨论】:

  • 您好,感谢您的快速回复。我试过了,得到一个错误“ForSalePage Identifier'property'的属性属性没有定义。'Array'不包含这样的memberAngular”
  • response 给你什么?
  • 如果console.log(response) 为您提供了您共享的json,然后执行let property of properties.properties.property"
  • 啊成功了! console.log(response) 确实以 json 响应。使用 *ngFor="let property of properties.properties.property" &lt;ion-card-header&gt;{{ property.addressNumber }} {{ property.addressStreet }}&lt;/ion-card-header&gt; 这是有效的,并且正在显示预期的结果,但是仍然存在错误“无法读取未定义的属性'property'”
  • Cannot read property 'property' of undefined" 在控制台日志中(多次)并且在 Visual Studio 代码中,错误“未定义标识符 'properties'。 NgFor 中的“数组”不包含这样的成员”
【解决方案2】:

你可以试试这个

在循环之前检查*ngIf="properties.properties.property?.length &gt; 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

我希望这会有用。

【讨论】:

    【解决方案3】:

    据我说,get 调用无法正确地将您的数据映射到您在接口中定义的属性。由于映射不正确,因此不会是可以循环的正确数组。

    根据您提供的所有变量,您需要通过以下方式对其进行循环:

    <ion-list *ngFor="let property of properties.properties.property">
    

    属性作为结果数组,然后属性作为 json + 属性的属性作为具有数据的实际数组... 甚至不知道这两个相同的标识符是否会起作用

    【讨论】:

    • 嗨,有人建议这样做,这是否按预期工作?我说有意?由于现在使用字符串插值,数据正在循环,但在控制台日志中我收到错误" Cannot read property 'property' of undefined 和视觉工作室代码Identifier 'properties' is not defined. 'Array' does not contain such a member 这是我第一次这样做,但我不禁觉得接口数组没有按预期工作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2018-09-14
    • 2020-08-15
    • 2021-06-06
    • 1970-01-01
    相关资源
    最近更新 更多