angular2:错误:TypeError:无法读取未定义的属性“...”

问题描述 投票:31回答:2

我附上了我的angular2代码片的plunker。我想从我的JSON打印一个字段但是无法打印,因为最初我的Object是null并且它是通过Promise填充的。

这是我的组件文件

import {Component, NgModule, OnInit} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'

class MyData {
  xyz : MySubData;
}

class MySubData {
  name : string;
} 
@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Hello {{name}}</h2>

      {{abc.xyz.name}}
    </div>
  `,
})
export class App implements OnInit {
  abc : MyData = null;
  constructor() {
    this.name = 'Angular2'
  }

  ngOnInit() {
    setTimeout(() => {
      this.abc = new MyData();
      this.abc.xyz = new MySubData();
      this.abc.xyz.name = "Binita";
    }, 2000);
  }
}

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ App ],
  bootstrap: [ App ]
})
export class AppModule {}

当我从我的模板中删除行{{abc.xyz.name}}时它运行正常。

我在我的代码中使用set time out因为我从Promise获取数据(即异步调用)。

我最初可以理解为abcnull,我的代码无法找到abc.xyz.name。但我不想把任何if条件检查。因为我在JSON中有几个属性,并且如果条件,每个属性都不可能写入。

在angularjs 1中,如果abc为null,那么它将自动用空字符串替换它。我想在angular2中做同样的事情。请建议。

下面是plunker

https://plnkr.co/edit/u1NqNF0penz7OS55QmoU?p=preview

angular angular2-template 2-way-object-databinding
2个回答
88
投票

那是因为abc在模板渲染时是未定义的。在HTTP调用完成之前,您可以使用安全导航操作符(?)来“保护”模板:

{{abc?.xyz?.name}}

您可以阅读有关安全导航操作员here的更多信息。

更新:

安全导航操作符不能在数组中使用,您必须利用NgIf指令来克服此问题:

<div *ngIf="arr && arr.length > 0">
    {{arr[0].name}}
</div>

阅读更多关于NgIf指令here的信息。


0
投票

Angular Template支持安全导航操作符或存在操作符或Null传播操作符。假设您有Component类

  myObj:any = {
    doSomething: function () { console.log('doing something'); return 'doing something'; },
  };
  myArray:any;
  constructor() { }

  ngOnInit() {
    this.myArray = [this.myObj];
  }

您可以在模板html文件中使用它,如下所示:

<div>test-1: {{  myObj?.doSomething()}}</div>
<div>test-2: {{  myArray[0].doSomething()}}</div>
<div>test-3: {{  myArray[2]?.doSomething()}}</div>
© www.soinside.com 2019 - 2024. All rights reserved.