【问题标题】:Angular takes Array as object and does not display the valuesAngular 将 Array 作为对象并且不显示值
【发布时间】:2018-05-17 19:21:04
【问题描述】:

// 随讨论更新

我尝试通过 http 请求获取 JSON 对象(任务)并将它们解析到我自己的类中以在我的 HTML 页面上显示它们(任务概述)。

这是我得到的:

这是我的 php 返回的 json 数组:

    {"result":[{"id":"3","znumber":"vor21423"},{"id":"2","znumber":"vor213"}]}

这是我对 angular.io 教程的最后一次尝试。我已经测试了很多答案,但其中大多数都与 .json() 相关,它不再是 HTML 客户端的一部分。

export class ApiComponent {
 private apiUrl = 'http://localhost:81/work/get.php';

 results: Steve[];

 constructor(private http: HttpClient) {
 }

 ngOnInit() {
   this.getSteves();
 }

 getSteves() {
   this.http.get<ItemsResponse>(this.apiUrl)
      .subscribe(data => {
        this.results = data.result
          .map(steve => new Steve(steve.id, steve.zNumber));
            console.log(this.results);
            console.log(data);
      });
  }
}

界面

import { Steve } from './Steve';
export interface ItemsResponse {
  results: Steve[];
}

HTML

<div>
  <div *ngFor="let steve of results">
    <p> - {{steve.id}}</p>
    <p> - {{steve.zNumber}}</p>
  </div>
</div>

史蒂夫班

export class Steve {
  public id = 0;
  public zNumber = '';

  constructor(id: number, zNumber: string) {
    this.id = id;
    this.zNumber = zNumber;
  }
}

API

<?php 
require_once('db.php');

$sql = 'SELECT * FROM jobs ORDER BY id DESC';
$result = $conn->query($sql);
if ($result->num_rows > 0) {
    $data = array();
    while($row = $result->fetch_assoc()){
        $data[] = $row;
    }
    echo json_encode(array('result' => $data));
} else {
    echo 0;
}
?>

【问题讨论】:

  • 在调试时尝试检查data对象我相信你应该使用result而不是results
  • 我认为 results 只是 json 数组的标识符。 // 'steves' 现在
  • results 是一个变量,因此可以随意命名。约定是使用单数,所以result。看起来来自服务器的 data 对象没有 steves 属性。

标签: php html angular typescript angular5


【解决方案1】:

首先,你接收的不是一个数组,而是一个Object,所以你需要从对象result中获取数组。其次,如果你想在 Steve 的数组实例中创建对象,你需要明确地告诉 Angular。

你的ItemsResponse实际上看起来像这样(注意result而不是results):

import { Steve } from './Steve';

export interface ItemsResponse {
  result: Steve[];
}

请求应显示您收到ItemsResponse 类型的响应。

 getSteves() {
   this.http.get<ItemsResponse>(this.apiUrl)
     .subscribe(data => {
       // your array is in 'result' object of your response
       this.results = data.result
         // create instances of your class
         .map(steve => new Steve(steve.id, steve.znumber))
     });
  }

【讨论】:

  • 好的,谢谢!输出现在显示 id,但不显示 znumber 字符串。知道为什么 znumber 未定义吗? // 更新了截图。
  • 因为znumber 来自后端,但您期望zNumber。替换:`.map(steve => new Steve(steve.id, steve.zNumber))` 为:`.map(steve => new Steve(steve.id, steve.znumber))`
  • 我在我的数据库中将 znumber 更改为 zNumber。有用。非常感谢你们的帮助:)
【解决方案2】:

您至少使用的是 Angular 版本 4。在版本 4 中,Angular 团队决定隐式解析 JSON 结果,因此您不必为每个 Ajax 请求编写 JSON.parse(json.result)

在您的示例中,您将服务器返回的值:result 替换为 steves,然后您尝试访问它:data['steves'] 但在屏幕截图中您可以看到这些值已经被 Angular 隐式 JSON 提取解析,你正在处理一个对象数组。

所以data['steves']data['result'] 等将始终未定义,导致在版本 4 中替换 Http 服务的 Angular HttpClient 服务在返回数据之前已经解析 JSON。

只需替换: this.results = data['steves'];this.results = data; 一切都会好起来的。

【讨论】:

  • 您不再有权访问数据['result'],因为 HttpClient 会为您解析它,删除结果并将其值分配给数据,然后返回它。所以返回的data 已经是您从服务器返回的数组。从后端返回 JSON 时,没有 resultresults、'steves' 和任何其他作为 JSON 的第一个属性的属性。 HttpClient 已经为你解析好了。
  • 我只能将数据分配给 this.results 。我收到此错误 -> 错误 TS2322:类型“ItemsResponse”不可分配给类型“Steve []”。 “ItemsResponse”类型中缺少属性“includes”。 data.results 没有引发错误,但给了我与截图中的 schown 相同的输出 // 将问题更新为我当前的代码
  • 那是因为这条线:this.http.get&lt;ItemsResponse&gt;(this.apiUrl)本质上你只是告诉TS编译器你的返回值是ItemsResponse,它有results属性然后你尝试将它分配给this.results Steve[] 类型。所以接口不兼容。使用 this.http.get&lt;Steve[]&gt;(this.apiUrl) 因为这是您从服务器返回的内容 - Steves 列表。
  • Cannot find a differ supporting object '[object Object]' of type 'object'. 意味着您尝试迭代对象属性而不是 *ngFor 中的数组因此,如果您的模板中有 &lt;div *ngFor="let steve of results"&gt;results 应该是一个数组,而不是一个对象。
  • 谢谢你!我不明白为什么 Angular 认为它是一个对象。它被声明为数组,是吗?
猜你喜欢
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2018-12-01
  • 2021-06-09
  • 1970-01-01
  • 2018-11-10
  • 2014-09-19
相关资源
最近更新 更多