Nik*_*las 6 javascript typescript angular2-http angular
我收到以下错误:
angular2.dev.js:23925 EXCEPTION: TypeError: Cannot read property 'Id' of null in [
{{ product.Id }}
in ProductEditComponent@0:68]
Run Code Online (Sandbox Code Playgroud)
抛出:
//Product-edit.component.ts:
import {Component } from 'angular2/core';
import { IProduct } from './product'
import { ProductService } from './product.service'
import { RouteParams } from 'angular2/router';
@Component({
template:`<div class="wrapper wrapper-content animated fadeInRight ecommerce">
{{ product.Id }}
</div>`,
})
export class ProductEditComponent{
product: IProduct = null;
errorMessage: string;
constructor(private _routeParams: RouteParams, private _productService: ProductService){
}
ngOnInit(): void {
this._productService.getProduct(this._routeParams.get('id'))
.subscribe(
product => this.product = product,
error => this.errorMessage = <any>error);
}
}
Run Code Online (Sandbox Code Playgroud)
ProductService:
getProduct(id: string): Observable<IProduct> {
return this._http.get(this._baseUrl + this._getProductUrl + '/' + id)
.map((response: Response) => <IProduct>response.json())
.do(data => console.log("All: " + JSON.stringify(data)))
.catch(this.handleError);
}
Run Code Online (Sandbox Code Playgroud)
服务器响应:
{"Id":"34d4efcy6","ExternalId":null,"UserId":"testing","ProductProvider":null,"Title":"Flaska vin","Desc":null,"MinDeliveryTime":null,"MaxDeliveryTime":null,"FreightCost":null,"Brand":null}
Run Code Online (Sandbox Code Playgroud)
我搞砸了什么?
dre*_*ore 23
在组件中,您将初始化product为null,然后product.Id在模板中引用.当Angular 在异步调用返回之前尝试绘制模板时,会发生错误- 此时product仍然为null,因此错误:Cannot read property 'Id' of null.
最直接的解决方案是使用Elvis运算符,Angular提供了这样的情况.您{{ product.Id }}可以{{ product?.Id }}在模板中替换它来使用它.
也就是说,使用这种方法可能会遇到更改检测问题,一般来说,使用以下方法会更好:
export class ProductEditComponent{
product: Observable<IProduct>; //product is an Observable
errorMessage: string;
constructor(private _routeParams: RouteParams, private _productService: ProductService){
//product is always defined because you instantiate it in the ctor
this._productService.getProduct(this._routeParams.get('id'));
}
Run Code Online (Sandbox Code Playgroud)
然后{{(product | async).Id }},您可以使用代替{{product.Id}}模板,利用AsyncPipe角度来处理订阅和更新UI的脏工作.
| 归档时间: |
|
| 查看次数: |
17406 次 |
| 最近记录: |