http的映射返回null对象中的observable结果

时间:2016-05-09 21:51:29

标签: typescript angular observable

我正在对我的后端getTest方法执行http请求。从使用fiddler测试的服务器返回的数据:

{
  "number": "1a",
  "testId": 1,
  "testNumber": 5,
  "testDate": "2016-05-20T00:00:00",
  "assignedPupils": [],
  "unAssignedPupils": []
}

订阅有问题,或者更确切地说 - 我认为 - 使用.map函数,但我不确定。当我尝试调试映射时,我从未进入EditTest类:/并且错误消息显示绑定的html中的错误,这太晚了。我需要知道为什么'测试'对象未定义!

有人看到了这个问题吗?

export class EditTestComponent implements OnInit {
    test: EditTest;

    constructor(
        private _testsService: TestsService,
        private _routeParams: RouteParams)
    { }

    ngOnInit() {
        let id = this._routeParams.get('id');
        this._testsService.getTest(id).subscribe(test => this.test = test.map(t => new EditTest(t))); 
    }

}


TestService.ts:

 getTest(id) {
        return this.http.get('api/tests/edit/' + id).map(res => res.json());
    }

HTML:

<div>
    <label>id: </label>{{test.id}}
    <label>number: </label>{{test.number}}
    <label>date: </label>{{test.date}}
</div>

我得到了这个例外:

XCEPTION: TypeError: Cannot read property 'id' of undefined in [{{test.id}}
         in EditTestComponent@3:27]

1 个答案:

答案 0 :(得分:1)

{{test.id}}从后端获取指定值之前,您正在引用test。该错误实际上会阻止脚本执行,甚至永远不会到达map。要解决此问题,请使用Elvis Operator ?

来自Angular.io cheat sheet

  

<p>Employer: {{employer?.companyName}}</p>
  安全导航操作符(?)表示雇主字段是可选的,如果未定义,则应忽略表达式的其余部分。

像这样使用:

<div>
    <label>id: </label>{{test?.id}}
    <label>number: </label>{{test?.number}}
    <label>date: </label>{{test?.date}}
</div>

此外,您没有显示EditTest的构造函数,因此我假设它接受属性并分配它们。