2016-05-01 2 views
2

ich diese Komponente haben:Angular 2: Ein Objekt während OnInit auf der Vorlage nicht definiert ist

export class CategoryDetailComponent implements OnInit{ 
    category: Category; 
    categoryProducts: Product[]; 
    errorMessage: string; 
    constructor(private _categoryService: CategoryService, private _productService: ProductService, private _routeParams: RouteParams) {} 

    ngOnInit() { 
    this.getCategoryAndProducts(); 
    } 
    getCategoryAndProducts() { 
    let categoryName = this._routeParams.get('name'); 
    let categoryId = this.routeParams.get('id'); 
    var params = new URLSearchParams(); 
    params.set('category', categoryName); 

    Observable.forkJoin(
     this._categoryService.getCategory(categoryId), 
     this._productService.searchProducts(params) 
    ).subscribe(
     data => { 
     //this displays the expected category's name. 
     console.log("category's name: "+ data[0].attributes.name) 
     this.category = data[0]; 
     this.categoryProducts = data[1]; 
     }, error => this.errorMessage = <any>error 
    ) 
    } 
} 

In der Vorlage Komponente Ich habe diese:

<h1>{{category.attributes.name}}</h1> 

Wenn ich auf diese Komponente zu navigieren, ich erhalte eine Fehlermeldung:

TypeError: cannot read property 'attributes' of undefined 

warum ist die category Eigenschaft auf der Vorlage nicht definiert und Wie kann ich das lösen?

+2

Verwenden elvis Operator Kategorie .attributes .name – yurzui

+0

@yurzui es hat funktioniert, können Sie in ein erklären Sie sich bitte antworte, warum es funktioniert hat, damit ich es akzeptieren kann. –

+0

Das Problem ist, dass Sie Kategorieobjekt asynchron starten. Sie könnten eine leere Objektkategorie initiieren: Category = {attributes: []} – yurzui

Antwort

5

Die Bindungen in der Vorlage werden vor ngOnInit() ausgewertet. Um zu verhindern, Angular einen Fehler werfen Sie

<h1>{{category?.attributes.name}}</h1> 

Der Elvis Operator verhindert Angular Auswertung .attributes... es sei denn category einen Wert verwenden können.

2

Sie können dies auch lösen, indem Sie Ihre Variablen initialisieren.

Init dies während erklärt:

export class CategoryDetailComponent implements OnInit{ 
    category: Category = new Category(); 
    ... 
    ... 
} 

OR init in Component Konstruktor:?

constructor(....) { 
    this.category = new Category(); 
}