使用 AJAX 初始化 Vue 数据
Initializing Vue data with AJAX
我正在尝试使用来自 AJAX 查询的 JsonResult
的数据填充 Vue。当我从我的视图模型对数据进行编码时,我的 Vue 可以很好地接收数据,但当我尝试使用 AJAX 检索它时却没有。这是我的代码的样子:
<script type="text/javascript">
var allItems;// = @Html.Raw(Json.Encode(Model));
$.ajax({
url: '@Url.Action("GetItems", "Settings")',
method: 'GET',
success: function (data) {
allItems = data;
//alert(JSON.stringify(data));
},
error: function (error) {
alert(JSON.stringify(error));
}
});
var ItemsVue = new Vue({
el: '#Itemlist',
data: {
Items: allItems
},
methods: {
},
ready: function () {
}
});
</script>
<div id="Itemlist">
<table class="table">
<tr>
<th>Item</th>
<th>Year</th>
<th></th>
</tr>
<tr v-repeat="Item: Items">
<td>{{Item.DisplayName}}</td>
<td>{{Item.Year}}</td>
<td></td>
</tr>
</table>
</div>
这是所有正确的包含。我知道 @Url.Action("GetItems", "Settings")
returns 是正确的 URL 并且数据按预期返回(由成功函数中的警报测试(参见 AJAX 中成功函数中的注释) . 像这样填充它:var allItems = @Html.Raw(Json.Encode(Model));
有效,但 AJAX 查询无效。我做错了什么吗?
我能够通过在 AJAX 调用的成功处理程序中执行必要的操作来解决我的问题。您可以将整个 Vue 对象创建放在那里,也可以只设置您需要的数据。
您可以在已挂载的函数内部进行 ajax 调用(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>
我遇到了同样的问题,上面的 Samuel De Backer 的回答解决了这个问题。
问题出在ajax成功回调函数,
如果你使用this.data,这是不正确的,因为当'this'引用vue-app时,你可以使用this.data,但是这里(ajax成功回调函数),这不引用 vue-app,而是 'this' 引用调用此函数的任何人(ajax 调用)。
所以必须在ajax之前设置var self = this,然后传入回调函数(成功回调)
这是我的工作代码
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 () {}
我正在尝试使用来自 AJAX 查询的 JsonResult
的数据填充 Vue。当我从我的视图模型对数据进行编码时,我的 Vue 可以很好地接收数据,但当我尝试使用 AJAX 检索它时却没有。这是我的代码的样子:
<script type="text/javascript">
var allItems;// = @Html.Raw(Json.Encode(Model));
$.ajax({
url: '@Url.Action("GetItems", "Settings")',
method: 'GET',
success: function (data) {
allItems = data;
//alert(JSON.stringify(data));
},
error: function (error) {
alert(JSON.stringify(error));
}
});
var ItemsVue = new Vue({
el: '#Itemlist',
data: {
Items: allItems
},
methods: {
},
ready: function () {
}
});
</script>
<div id="Itemlist">
<table class="table">
<tr>
<th>Item</th>
<th>Year</th>
<th></th>
</tr>
<tr v-repeat="Item: Items">
<td>{{Item.DisplayName}}</td>
<td>{{Item.Year}}</td>
<td></td>
</tr>
</table>
</div>
这是所有正确的包含。我知道 @Url.Action("GetItems", "Settings")
returns 是正确的 URL 并且数据按预期返回(由成功函数中的警报测试(参见 AJAX 中成功函数中的注释) . 像这样填充它:var allItems = @Html.Raw(Json.Encode(Model));
有效,但 AJAX 查询无效。我做错了什么吗?
我能够通过在 AJAX 调用的成功处理程序中执行必要的操作来解决我的问题。您可以将整个 Vue 对象创建放在那里,也可以只设置您需要的数据。
您可以在已挂载的函数内部进行 ajax 调用(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>
我遇到了同样的问题,上面的 Samuel De Backer 的回答解决了这个问题。
问题出在ajax成功回调函数,
如果你使用this.data,这是不正确的,因为当'this'引用vue-app时,你可以使用this.data,但是这里(ajax成功回调函数),这不引用 vue-app,而是 'this' 引用调用此函数的任何人(ajax 调用)。
所以必须在ajax之前设置var self = this,然后传入回调函数(成功回调)
这是我的工作代码
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 () {}