2016-10-20 2 views
0

Ich habe eine Komponente, die ich Daten auf mit AJax erstellen und ich zeige dies in einer Vorlage. Im Prinzip habe ich dies:Vue nicht meine Daten rendern

mein Vue Code:

Vue.component('feedback-table', { 
    template: '#grid-template', 
    data: function() { 
     return { 
      chancesOfApproval:[], 
     } 
    }, 
    created:function(){ 
     $.getJSON('/getFeedbackQuestionsAndChances',function(data){ 
      this.chancesOfApproval = data.chancesOfApproval; 
     }.bind(this)); 
    }, 


}); 

new Vue({ 
    el: '#feedback-wrapper', 
}); 

Und hier ist meine Vorlage:

<template id="grid-template"> 

    <table class="table table-bordered table-responsive table-striped"> 
     <tr v-for="entry in chancesOfApproval"> 
      <td>@{{ entry.position }}</td> 
     </tr> 
    </table> 
</template> 

<div id="feedback-wrapper"> 
    <feedback-table></feedback-table> 
</div> 

Die Daten werden von der jquery getted denn wenn ich console.log (dies .chanceOfApproval) zum Beispiel erscheint es in der Konsole gut. Und ich bekomme keinen Fehler in meiner Konsole, deshalb habe ich keine Ahnung, warum es nicht funktioniert.

+0

Haben Sie VueJS Dev Tools für Chrome? Wie sind die Daten dort dargestellt? –

+0

Ja, ich tue, und es zeigt nichts –

Antwort

0

Es verhält sich wie erwartet hier, wo ich die getJSON für eine setTimeout ausgeschaltet habe, die die gleiche Aufgabe erledigt.

Vue.component('feedback-table', { 
 
    template: '#grid-template', 
 
    data: function() { 
 
    return { 
 
     chancesOfApproval: [], 
 
    } 
 
    }, 
 
    created: function() { 
 
    /* 
 
    $.getJSON('/getFeedbackQuestionsAndChances', function(data) { 
 
     this.chancesOfApproval = data.chancesOfApproval; 
 
    }.bind(this)); 
 
    */ 
 
    setTimeout(() => { 
 
     this.chancesOfApproval = [{ 
 
     position: 1 
 
     }, { 
 
     position: 2 
 
     }]; 
 
    }, 500); 
 
    }, 
 

 

 
}); 
 

 
new Vue({ 
 
    el: '#feedback-wrapper', 
 
});
<script src="//cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.min.js"></script> 
 
<template id="grid-template"> 
 

 
    <table class="table table-bordered table-responsive table-striped"> 
 
    <tr v-for="entry in chancesOfApproval"> 
 
     <td>@{{ entry.position }}</td> 
 
    </tr> 
 
    </table> 
 
</template> 
 

 
<div id="feedback-wrapper"> 
 
    <feedback-table></feedback-table> 
 
</div>

+0

All Ihre Code nur auf meiner HTML-Seite funktioniert gut, aber wenn ich es auf andere Dateien, funktioniert es nicht. Der seltsame Teil ist, dass, wenn ich einen var test: 'a' anlege und versuche, es auf meiner Vorlage zu rendern, es gut funktioniert –

+0

Klingt, als ob es ein Problem mit der Laravel-Seite gibt, die Sachen zusammenfügt. Nicht etwas, mit dem ich Erfahrung habe. :( –

0

Sie function.bind verwenden (diese) this vom äußeren Umfang zum Funktionsumfang zu bringen, in Ihrem $http Erfolg Handler.

Haben Sie überprüft, ob es Probleme gibt? Mir ist nicht bekannt, wie bind implementiert ist. Vielleicht erlaubt es Vue nicht, seine Reactivity System auszulösen.

Wenn Sie Werte in der Konsole als einfaches JSON-Objekt sehen, ist es wahrscheinlich falsch. Vue.js modifiziert Objektparameter zu Gettern/Settern/Beobachtern, damit es an das DOM binden kann.

Alternativ versuchen Sie die Pfeilfunktion oder verwenden Sie eine self Variable, nur um zu sehen, ob es das Problem löst?

Pfeil-Funktion (ES6 und höher):

created:function(){ 
    $.getJSON('/getFeedbackQuestionsAndChances',data => { 
     this.chancesOfApproval = data.chancesOfApproval; 
    }); 
} 

oder eine lokale Variable verwenden:

created:function(){ 
    var self = this; // self points to this of Vue component 
    $.getJSON('/getFeedbackQuestionsAndChances',function(data){ 
     self.chancesOfApproval = data.chancesOfApproval; 
    }); 
} 

Noch ein Hinweis: statt setTimeout(), haben Sie auch die Möglichkeit, Vue.nextTick() wie folgt:

Vue.nextTick(function() { 
    // DOM updated 
}) 

oder in Ihrem Fall:

this.$nextTick(function() { 
    // DOM updated 
}) 
+0

Ich habe das versucht, und auch nicht funktioniert. Aber ich finde heraus, dass es passiert, wenn ich diese Datei in eine andere Datei importieren (Feedback von "./Feedback" importieren;) Wenn ich diesen Import aus der anderen Datei entfernen, Es funktioniert einwandfrei, kann ich keine Dateien mit globalen Vue-Komponenten importieren? –

+0

Ich habe noch nicht versucht, jQuery.getJSON in einer View-Komponente zu verwenden, daher weiß ich nicht, was hier falsch läuft vue-resource'? (https: // github.com/vuejs/vue-resource) Das ist das offizielle Plugin für die Verwaltung aller HTTP-Anfragen. – Mani

+0

vue-resource ist der getJSON-Methode ebenfalls sehr ähnlich. Sie können sich das Beispiel auf der github-Seite ansehen. Sie werden wie folgt vorgehen: 'this. $ Http.get ('/ someUrl'). Dann (response => {...});' – Mani