Ich versuche, ein Vue mit Daten aus dem zu füllen JsonResult einer AJAX-Abfrage. Mein Vue empfängt die Daten problemlos, wenn ich sie aus meinem Ansichtsmodell codiere, aber nicht, wenn ich versuche, sie mit AJAX abzurufen. So sieht mein Code aus:
Dies ist mit allen richtigen Includes. ich weiß das @Url.Action("GetItems", "Settings") gibt die richtige URL zurück und die Daten kommen wie erwartet zurück (wie durch eine Warnung in der Erfolgsfunktion getestet (siehe Kommentar in der Erfolgsfunktion in AJAX). Füllen Sie es so aus: var allItems = @Html.Raw(Json.Encode(Model)); funktioniert, aber die AJAX-Abfrage nicht. Mache ich etwas falsch?
Sie müssen die Datenelemente der Ansicht aktualisieren, nachdem Sie die Daten erhalten haben. Beachten Sie, dass Ajax asynchron ist (daher der Name), sodass Sie nur Daten in haben success Rückruffunktion!
– Jeff
5. September 2015 um 14:03 Uhr
Wie kann ich das machen? Ich kann ItemsVue.data.Items nicht richtig machen? Ich bin mir nicht sicher, wie ich es zu diesem Zeitpunkt aktualisieren soll …
– muttley91
5. September 2015 um 14:05 Uhr
Ich denke, ich kann einfach mein Vue in der erstellen success Rückruffunktion!
– muttley91
5. September 2015 um 14:13 Uhr
Entschuldigung, ich kenne die API von vue.js nicht, kann also nicht helfen. Nach einem kurzen Blick auf die Referenz würde ich vorschlagen, es zu versuchen: ItemsVue.$data.items=data Innerhalb success zurückrufen.
– Jeff
5. September 2015 um 14:15 Uhr
Sie müssten die var nur zuerst im globalen Geltungsbereich definieren, wenn Sie sie im erstellen successzurückrufen
– Jeff
5. September 2015 um 14:16 Uhr
Samuel De Backer
Sie können den Ajax-Aufruf innerhalb der gemounteten Funktion durchführen („bereit“ in Vuejs 1.x).
<script type="text/javascript">
var ItemsVue = new Vue({
el: '#Itemlist',
data: {
items: []
},
mounted: function () {
var self = this;
$.ajax({
url: '/items',
method: 'GET',
success: function (data) {
self.items = JSON.parse(data);
},
error: function (error) {
console.log(error);
}
});
}
});
</script>
<div id="Itemlist">
<table class="table">
<tr>
<th>Item</th>
<th>Year</th>
</tr>
<tr v-for="item in items">
<td>{{item.DisplayName}}</td>
<td>{{item.Year}}</td>
</tr>
</table>
</div>
Sehen Sie, ich habe es versucht. Vielleicht habe ich etwas anderes falsch gemacht, ich bin mir nicht sicher.
– muttley91
8. September 2015 um 3:30 Uhr
Soll das nicht sein self.data.Items = data ?
– Schikloshi
17. November 2016 um 18:05 Uhr
Das Setzen von „self“ als Verweis auf den ursprünglichen „this“-Bereich ist der Schlüssel
– Ryan Marshall
22. Januar 2017 um 0:52 Uhr
Ich verwende vuejs 2.0 mit gemountetem. Seine Arbeit mit var self = this; Danke – @samuel
– M Arfan
11. Mai 2017 um 13:21 Uhr
positiv bewertet! Hier ist eine einfache Frage, sagen wir, Sie haben eine lokale Feldansicht, die auf A eingestellt ist, nachdem Ajax-Daten geladen wurden, sollte es B sagen, sollten Sie A vor dem Laden oder nach dem Laden der Daten in B ändern? Der Unterschied hier ist, wenn Sie vor dem Laden A auf B setzen, ändert sich die Ansicht sofort, aber die Daten können nach dem Laden gerendert werden oder nicht, aber wenn Sie nach dem Laden von A auf B ändern, hängt die Benutzeroberfläche etwa eine Sekunde lang, bis die Daten hier sind
– PirateApp
12. Februar 2019 um 3:39 Uhr
Ich konnte mein Problem lösen, indem ich meine notwendige Aktion innerhalb des Erfolgshandlers für den AJAX-Aufruf ausführte. Sie können entweder die gesamte Vue-Objekterstellung dort einfügen oder nur die Daten festlegen, die Sie benötigen.
@ muttley91 Auch wenn dieser Weg funktioniert, bedeutet das nicht, dass er richtig ist, sicherlich sollte dies nicht die akzeptierte Antwort sein. danke für das Posten der Frage.
– Hemerson Varela
21. Juli 2017 um 14:54 Uhr
hochgestimmt, weil es Situationen gibt, in denen es viel sinnvoller ist, den Vue erst zu rendern, nachdem eine Reihe von Datenaufrufen abgeschlossen und alle Daten verarbeitet wurden.
– Jogi
27. November 2019 um 5:22 Uhr
Ich hatte das gleiche Problem, das durch die Antwort von Samuel De Backer oben behoben wurde.
Das Problem liegt bei der Ajax Success Callback-Funktion,
Wenn Sie this.data verwenden, ist dies falsch, denn wenn „this“ auf die vue-app verweist, könnten Sie this.data verwenden, aber hier (Ajax Success Callback-Funktion) verweist dies nicht auf vue-app, sondern auf „this ‘ Verweis auf denjenigen, der diese Funktion aufgerufen hat (Ajax-Aufruf).
Sie müssen also var self = this vor ajax setzen und dann in die Callback-Funktion übergehen (Erfolgsrückruf)
Hier ist mein Arbeitscode
created () {
this.initialize()
},
mounted () {
this.getData()
},
methods: {
getData() {
var getUser_url = url + 'cfc/sw.cfc?method=getUser&returnformat=json&queryformat=struct';
console.log(getUser_url )
/*
You can use a plethora of options for doing Ajax calls such as Axios, vue-resource or better yet the browser's built in fetch API in modern browsers.
You can also use jQuery via $.ajax() API, which simply wraps the XHR object in a simple to use method call
but it's not recommended to include the whole jQuery library for the sake of using one method.
http://updates.html5rocks.com/2015/03/introduction-to-fetch
The Fetch API provides a JavaScript interface for accessing and manipulating parts of the HTTP pipeline, such as requests and responses.
It also provides a global fetch() method that provides an easy, logical way to fetch resources asynchronously across the network.
*/
// ********** must use self = this **************
// this reference vue-app. must pass it to self, then pass into callback function (success call back)
var self = this;
fetch(getUser_url).then(function (response) {
return response.json();
}).then(function (result) {
console.log(result);
// must use self.user, do not use this.user,
// because here, this's scope is just the function (result).
// we need this reference to vue-app,
self.user = result; // [{}, {}, {}]
}); // fetch(){}
console.log(this.user);
},
initialize () {}
12462800cookie-checkVue-Daten mit AJAX initialisierenyes
Sie müssen die Datenelemente der Ansicht aktualisieren, nachdem Sie die Daten erhalten haben. Beachten Sie, dass Ajax asynchron ist (daher der Name), sodass Sie nur Daten in haben
success
Rückruffunktion!– Jeff
5. September 2015 um 14:03 Uhr
Wie kann ich das machen? Ich kann ItemsVue.data.Items nicht richtig machen? Ich bin mir nicht sicher, wie ich es zu diesem Zeitpunkt aktualisieren soll …
– muttley91
5. September 2015 um 14:05 Uhr
Ich denke, ich kann einfach mein Vue in der erstellen
success
Rückruffunktion!– muttley91
5. September 2015 um 14:13 Uhr
Entschuldigung, ich kenne die API von vue.js nicht, kann also nicht helfen. Nach einem kurzen Blick auf die Referenz würde ich vorschlagen, es zu versuchen:
ItemsVue.$data.items=data
Innerhalbsuccess
zurückrufen.– Jeff
5. September 2015 um 14:15 Uhr
Sie müssten die var nur zuerst im globalen Geltungsbereich definieren, wenn Sie sie im erstellen
success
zurückrufen– Jeff
5. September 2015 um 14:16 Uhr