2015-12-31 10 views
7

में अपरिभाषित है, मैं एक स्थानीय जेसन फ़ाइल पढ़ने की कोशिश कर रहा हूं और इसे उस वर्ग में पार्स कर रहा हूं जिसे मैंने वही गुण दिया है। जब मैं कक्षा से पढ़ने की कोशिश करता हूं, तो यह मुझे त्रुटियों देता है कि कक्षा शून्य या अपरिभाषित है।http.get() से लोड JSON डेटा मेरे कोणीय 2 टेम्पलेट

import {Item} from '../item/item'; 
export class Hall { 
    constructor(public id:number, 
       public naam:string, 
       public oppervlakte:number, 
       public aantalItems:number, 
       public itemsMetNodigeActie:number, 
       public items:Item[]) { 
    } 
} 

यह item.ts का उपयोग करता है:

मैं एक फ़ाइल hall.ts जो इस तरह दिखता है

export class Item { 
    constructor(public categorie:string, 
       public naam:string, 
       public productnummer:string, 
       public omschrijving:string, 
       public laatsteUitgevoerdeActie:Actie, 
       public eerstVolgendeActie:Actie) { 
    } 
} 
export class Actie{ 
    constructor(datum: string, 
       type: string, 
       omschrijving: string){} 
} 

json फ़ाइल, hall1.json, कि मैं इस तरह दिखता है से पढ़ने के लिए कोशिश कर रहा हूँ:

{ 
    "id": 1, 
    "naam": "hall1", 
    "oppervlakte": 100, 
    "aantalItems": 3, 
    "itemsMetNodigeActie": 3, 
    "items": [ 
    { 
     "id": 1, 
     "categorie": "machine", 
     "productnummer": "ADE124e", 
     "omschrijving": "print papieren af", 
     "laatsteUitgevoerdeActie": { 
     "datum": "2015-01-05T00:00:00.000Z", 
     "type": "vervanging", 
     "omschrijving": "papier vervangen" 
     }, 
     "eerstVolgendeActie": { 
     "datum": "2016-01-06T00:00:00.000Z", 
     "type": "vervanging", 
     "omschrijving": "inkt vervangen" 
     } 
    } 
    ] 
} 

मैं hall.service.ts का उपयोग कर रहा हूं एच जेएसओ फ़ाइल को पढ़ने की कोशिश करता है जो स्थानीय रूप से संग्रहीत है, और इसे Hall ऑब्जेक्ट में लौटाता है। ऐसा करने के लिए कि methode है:

public getHall(): Observable<Hall> { 
    return this.http.get('app/hall/hall1.json') 
     .map((res:Response) => res.json()); 
} 

मैं अपने hallDetail.component.ts

export class HallDetailComponent implements OnInit{ 
    public hall: Hall; 
    constructor(
     private service: HallService 
    ){} 
    ngOnInit(){ 
     this.service.getHall().subscribe((hall:Hall) => { 
      this.hall = hall; 
     }) 
    } 
} 

में इस पद्धति का उपयोग अब तक यह मुझे किसी भी त्रुटि नहीं देता है, लेकिन जब मैं hall वस्तु से पढ़ने की कोशिश , यह sais है कि यह अपरिभाषित है

@Component({ 
    template: ` 
    <div> 
    {{hall.naam}} 
    </div> 
    ` 
}) 

त्रुटि:

EXCEPTION: TypeError: Cannot read property 'naam' of undefined in [ 
    {{hall.naam}} 
    in [email protected]:7] 
+0

क्या आपने परिणाम को लॉगिंग करने का प्रयास किया था। यह देखने के लिए कि क्या आप वास्तव में सामग्री लोड कर रहे हैं? – toskv

+2

देखें [एल्विस ऑपरेटर] (https://angular.io/docs/ts/latest/guide/template-syntax.html) –

उत्तर

10

आपको याद रखना होगा कि http.get() कॉल async है। आपका टेम्पलेट आपके एसिंक http कॉल द्वारा हल किए जाने से पहले किसी ऑब्जेक्ट के रूप में hall को संसाधित करने का प्रयास कर रहा है।

यही कारण है कि hall अनिर्धारित है और इसलिए, आप इस पर किसी भी गुण का उपयोग नहीं कर सकते (यह अभी तक मौजूद नहीं है)।

एरिक टिप्पणी में उल्लेख किया है, अपने टेम्पलेट के लिए कुछ इस तरह का प्रयास करें:

@Component({ 
    template: ` 
    <div> 
    {{hall?.naam}} <!-- note the added ? --> 
    </div> 
    ` 
}) 

कि hall अशक्त सुरक्षित पर naam के संदर्भ में कर देगा।

अद्यतन:

पूर्णता के लिए के लिए, मैं आपको बताएंगे कि आप वास्तव में * ngIf इस के लिए भी उपयोग कर सकते हैं, हालांकि अशक्त सुरक्षित जांच एक क्लीनर की तलाश में टेम्पलेट के लिए बनाता है।

@Component({ 
    template: ` 
    <div *ngIf="hall"> <!-- note the added *ngIf --> 
    {{hall.naam}} 
    </div> 
    ` 
}) 
+0

Thx आदमी ने इसे ठीक किया !! – Kupi

+0

किसी ने एसओ पर एक और टिप्पणी में उल्लेख किया है कि आप '

{{thing}}
'जैसे कुछ के साथ बेहतर प्रदर्शन प्राप्त कर सकते हैं, क्योंकि यह केवल तभी प्रस्तुत करेगा यदि वह चीज़ वहां है। – Josh

+1

@ जोश मुझे आश्चर्य नहीं करेगा। कोणीय 1 में ngIf का उपयोग इसी कारणों से ngHide और ngShow से अधिक प्रदर्शनकारी था।लेकिन बाइंडिंग बहुत तेजी से हैं, सिद्धांत रूप में, एनजी 2 में, इसलिए यदि आपके पास इन दृश्यों में से 100 सुरक्षित दृश्य नहीं हैं तो शायद यह एक सराहनीय अंतर नहीं देगा। –

संबंधित मुद्दे