2017-01-23 3 views
1

Hallo Leute, ich benutze Vue JS, um zu versuchen, meine Daten zu durchlaufen. Hier ist meine ganze JS-Datei:Vue JS v-für keine Iteration über Array

var contentful = require('contentful'); 

var client = contentful.createClient({ 
    space: 'HIDDEN', 
    accessToken: 'HIDDEN' 
}); 

Vue.component('careers', { 
    template: '<div><div v-for="career in careerData">{{ fields.jobDescription }}</div></div>', 

    data: function() { 
    return { 
    careerData: [] 
    } 
    }, 

    created: function() { 
    this.fetchData(); 
    }, 

    methods: { 
    fetchData: function() { 
    client.getEntries() 
    .then(function (entries) { 
     // log the title for all the entries that have it 
     entries.items.forEach(function (entry) { 
     if(entry.fields.jobTitle) { 
      this.careerData = entries.items; 
     } 
     }) 
    }); 
    } 
    } 
}); 

var app = new Vue({ 
    el: '#app' 
}); 

I Methoden verwenden einige Daten aus gehalt zugreifen zu können, sobald sie die erforderlichen Daten gepackt hat es zu meinem Datenobjekt gesendet wird.

Wenn ich console.log(careerData); in meiner Konsole folgende Daten zurückgegeben:

enter image description here

Also würde ich erwarten, wenn ich v-for in meiner Vorlage verwendet und versuchte, über careerData laufen würde es machen richtig aber auf meiner Front -Ende ich bin mit einem leeren div links wie folgt:

<div id="app"><div></div></div> 

ich zur Zeit meine Komponente in meine HTML bin ziehen wie so:

<div id="app"> 
    <careers></careers> 
</div> 

In meiner Konsole werden keine Fehler angezeigt. Können Sie sich irgendeinen Grund dafür vorstellen?

Danke, Nick

+1

hinzufügen, sollte der Code in Ihrer Vorlage nicht '{{career.fields.jobDescription}}' sein? – UnholySheep

+0

Ich denke, dass Ihr v-for beginnt, zu iterieren, bevor die Daten abgerufen werden. Sie müssen auf fetchData() warten, um den Rückruf abzuschließen, bevor Sie careerData durchlaufen. Vielleicht einen Check hinzufügen, wenn careerData etwas enthält? –

Antwort

1

Mehrere Probleme, die ich denke. Wie @dfsq sagte, sollten Sie eine Pfeilfunktion verwenden, wenn Sie den Kontext beibehalten möchten (this).

fetchData: function() { 
    client.getEntries() 
    .then(entries => { 
     this.careerData = entries.items 
    }); 
} 

Dann können Sie {{fields.jobDescription}} durch {{career.fields.jobDescription}} ersetzen, wie @unholysheep schrieb.

Es kann funktionieren. Wenn dies nicht der Fall ist, können Sie eine this.$forceUpdate(); direkt nach this.fetchData();

+0

Danke das hat mir wirklich geholfen, ich bin verwirrt warum ich die foreach nicht mehr benutzen muss. Maybes Ich muss ein bisschen mehr Forschung darüber machen, was 'then' dann macht. –

0

Pfeil Funktion in forEach Rückruf, so dass Sie nicht verlieren Kontext tun:

fetchData: function() { 
    client.getEntries() 
    .then(entries => { 
     this.careerData = entries.items 
    }); 
} 
+0

Das alleine löst das Problem nicht – gurghet