【问题标题】:Angular - Table data showing up as NaN on web pageAngular - 表格数据在网页上显示为 NaN
【发布时间】:2018-02-03 21:32:47
【问题描述】:

我已经被这个问题困扰了一段时间。我只是想将包含 Id、Name 和 Create Date 列的表加载到页面。我的 API 方法在 Visual Studio 的 Controller 类中运行良好。我之前在控制台中遇到过这个错误:

TypeError:无法读取未定义的属性“id”。

如果我删除 id 等,name 也会出现此错误。

我进行了一些研究并了解到我可以使用 ? elvis 运算符,我已将其实现到我的 HTML 中。实现 elvis 运算符后,错误消失了,但所有表值现在都显示为 NaN。在开发者工具中的网络下,我可以点击我的表名并查看我的表中填充的数据。

知道问题可能是什么吗?我已包含以下代码:

test-table-tburns-list.component.html

<div>
  <table>
      <tr>
          <th>Id</th>
          <th>Name</th>
          <th>Create Date</th>
      </tr>

      <tr *ngFor="let test-table-tburns of testTableTburnsList">
          <td>{{ test-table-tburns?.id }}</td>
          <td>{{ test-table-tburns?.name }}</td>
          <td>{{ test-table-tburns?.createDate }}</td>
      </tr>
  </table>
</div>

test-table-tburns-list.component.spec.ts

import { async, ComponentFixture, TestBed } from '@angular/core/testing';   
import { TestTableTburnsListComponent } from './test-table-tburns-list.component';

describe('TestTableTburnsListComponent', () => {
  let component: TestTableTburnsListComponent;
  let fixture: ComponentFixture<TestTableTburnsListComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ TestTableTburnsListComponent ]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(TestTableTburnsListComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});

test-table-tburns-list.component.ts

import { Component, OnInit } from '@angular/core';
import { TestTableTburnsApiService } from '../../../services/test-table-tburns-api.service';
import { TestTableTburnsModel } from '../../../models/test-table-tburns-model';

@Component({
  selector: 'app-test-table-tburns-list',
  templateUrl: './test-table-tburns-list.component.html',
  styleUrls: ['./test-table-tburns-list.component.css']
})
export class TestTableTburnsListComponent implements OnInit {
  testTableTburnsList: Array<TestTableTburnsModel>;
  title = "Hello TestTableTburns List";


  constructor(private testTableTburnsApi: TestTableTburnsApiService) { }

  ngOnInit() {
    this.testTableTburnsApi
    .getTestTableTburns()
    .subscribe(_ => this.testTableTburnsList = _, e => console.log(e));
  }

}

test-table-tburns-api.service.spec.ts

import { TestBed, inject } from '@angular/core/testing';

import { TestTableTburnsApiService } from './test-table-tburns-api.service';

describe('TestTableTburnsApiService', () => {
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [TestTableTburnsApiService]
    });
  });

  it('should be created', inject([TestTableTburnsApiService], (service: TestTableTburnsApiService) => {
    expect(service).toBeTruthy();
  }));
});

test-table-tburns-api.service.ts

import { Injectable } from '@angular/core'
import { Http, Response, Headers } from '@angular/http';
import { environment } from '../../environments/environment';
import 'rxjs/add/operator/map';

@Injectable()
export class TestTableTburnsApiService {

  domain : string;

  constructor(public http: Http){
      this.domain = environment.apiUrl;
  }

  public getTestTableTburns(){
      let uri = this.domain + `/api/test-table-tburns`;

      return this.http
      .get(uri)
      .map((res: Response) => {
          return res.json();
      })
      ;
  }
}

【问题讨论】:

  • 响应的实际情况如何?在这种情况下,显示 NaN 似乎很不寻常。
  • 我的意思是您收到的响应如何? JSON。
  • 响应为 200 'OK'。我认为它没有任何问题。
  • 但是 JSON 响应是什么?您收到的数据:D 复制粘贴您的 JSON 的 sn-p。
  • 希望我没有感到困惑。这是你要找的吗?这是我收到的数据: [{"id":1,"name":"Tyler Burns","createDate":"2018-01-18T15:31:47.12"},{"id":2," name":"John Smith","createDate":"2018-01-18T15:35:22.333"},{"id":3,"name":"Bob Jones","createDate":"2018-01- 18T15:35:22.333"},{"id":4,"name":"Brian Hall","createDate":"2018-01-18T15:35:22.333"},{"id":5,"name ":"Amy Cook","createDate":"2018-01-18T15:35:22.333"},{"id":7,"name":"测试用户","createDate":"2018-01-22T20 :51:55.22"}]

标签: angular html-table components nan


【解决方案1】:

原因是,您使用的是破折号,即 - 在您的 *ngFor 中,这是不允许的,因为它会被视为减法,因此 Angular 正确指出减法的结果不是号码,又名NaN。所以使用没有破折号的命名约定:

<tr *ngFor="let test of testTableTburnsList">
  <td>{{test.id}}</td>
</tr>

同样在这种情况下,在迭代数组时不需要安全导航运算符,因此如果 testTableTburnsList 是假的,它不会尝试显示数组中的单个对象,除非有值。

【讨论】:

  • 如此微妙的事情怎么会导致一天的头痛。感谢您解决这个问题!
  • 是的,我也花了一段时间才看到它。当我尝试您的代码时,我意识到:D 祝您周末愉快,编码愉快! :)
【解决方案2】:

javascript/typescript 中不存在 monadic null 检查。所以你可以删除那些'?在模板中。

错误TypeError: Cannot read property 'id' of undefined 告诉您属性testTableTburnsList 是一个包含至少一个等于未定义项的数组。您应该尝试在模板中添加{{ testTableTburnsList | json }} 以了解您的问题(可能位于TestTableTburnsApiService

【讨论】:

  • 感谢您的回复。我从 HTML 中删除了 ? elvis 运算符。我对您添加{{ testTableTburnsList | json }} 的请求感到有些困惑。你能帮我理解吗?我将 API 服务代码添加到我的原始帖子中。希望这会有所帮助。
  • 在模板中使用{{ testTableTburnsList | json }},您将能够查看属性testTableTburnsList 的实际值。也许您应该在组件构造函数中将该属性实例化为 [] 以避免它未定义
  • @WilliamKLEIN 使用安全导航运算符在 Angular 中很常见...angular.io/guide/…
  • 在模板中使用{{ testTableTburnsList | json }},表格显示6行空值(表格中有6个参与者)。另外,我之前使用了安全导航运算符,表格显示了每个值应该在哪里的 NaN。
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 2017-12-18
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2012-03-22
  • 2022-07-11
相关资源
最近更新 更多