vue js ajax inside another ajax 正在获取数据但不呈现视图
vue js ajax inside another ajax is getting data but not rendering view
有一种情况,我必须在 vuejs 中的第一个 ajax(在 mounted
函数中)之后获取额外的数据,我将第二个 ajax 放在 if
条件和第一个 ajax!
的内部 success
函数
它正在工作,我在 chrome 中看到 Vue Devtools 中的数据,但数据未在视图中呈现。
伪代码:
var vm = new Vue({
el: '#messages',
data: {
participants: [],
active_conversation: '',
messages: []
},
methods: {
getParticipants: function () {
return this.$http.post('message/get-participants').then(
function (response) {
vm.participants = response.data.participants;
// if there is a conversation_id param in url
if (getUrlParameterByName('conversation_id')) {
// Second Ajax Is Called Here inside First Ajax
return vm.getConversationMessages (getUrlParameterByName('conversation_id')); // this ajax call is getting data but not showing in view
}
}
},
getConversationMessages : function(conv_id){
// Second Ajax Call to get Conversation messages
// and showing them , works onClick
return this.$http.post('message/get-messages/' + conv_id).then(
function (response) {
if (response.data.status == 'success') {
console.log(response.data.messages)
vm.messages = response.data.messages;
vm.$forceUpdate();
}
},
mounted: function () {
this.getParticipants()
}
})
第二个 Ajax 获取特定对话消息的调用正在响应 onclick
事件并显示消息,但是当在第一个 Ajax 成功响应中使用此功能时(getParticipants()
),它正确获取数据,我可以在 DevTools VueJs 扩展中看到消息已设置但视图不显示消息,我已经尝试 vm.$set()
但没有机会。
更新:
第二个 Ajax 没有错误,消息数据 属性 已填充(我检查了 Vue DevTools),唯一的问题是视图不显示消息!!但是当我通过单击对话手动执行此操作时,第二个 ajax 再次执行,我可以看到消息!,我也在第二个 ajax 之后尝试 vm.$forceUpdate()
没有机会。
Update2 html部分(错误在这里!!)
<a vbind:id="conv.id" v-on:click="getMessages(conv.id)" onclick="$('#user-messages').addClass('active')">
当您仅使用 getConversationMessages
而不放置 ajax 请求时,DOM 会更新消息
getParticipants
的ajax请求的成功回调中的getConversationMessages
就是在这一行遇到错误
this.participants = response.data.participants;
您在 ajax 请求的成功回调中使用了普通函数,这就是 this
未指向 vue 实例的原因
adnd this.participants
给你一个未定义的错误。所以使用 vm
而不是指向 vue 实例,就像你在程序的其余部分所做的那样
vm.participants = response.data.participants;
编辑
var vm = new Vue({
el: '#messages',
data: {
participants: [],
active_conversation: '',
messages: []
},
methods: {
getParticipants: function () {
return this.$http.post('message/get-participants');
},
getConversationMessages : function(conv_id){
return this.$http.post('message/get-messages/' + conv_id);
}
},
mounted: function () {
this.getParticipants().then(function (response){
vm.participants = response.data.participants;
if (getUrlParameterByName('conversation_id')) {
return vm.getConversationMessages (getUrlParameterByName('conversation_id')); // this ajax call is getting data but not showing in view
}
}).then(function(response){
if (response.data.status == 'success') {
console.log(response.data.messages)
vm.messages = response.data.messages;
});
}
})
在使用 http 回调完成第一个 http 请求后调用第二个 http 请求,或者您也可以使用 Promise。
return this.$http.post(function(response){
// first call
}).then(function(response){
// Second call
})
new Vue({
el: '#messages',
data: {
participants: [],
active_conversation: '',
messages: []
},
methods: {
async getParticipants (id) {
var response = await this.$http.post('message/get-participants')
this.participants = response.data.participants
if (id) this.getConversationMessages(id)
},
async getConversationMessages (id) {
var response = this.$http.post('message/get-messages/' + id)
if (response.data.status === 'success') {
console.log(response.data.messages)
this.messages = response.data.messages;
}
}
},
created () {
this.getParticipants(getUrlParameterByName('conversation_id'))
}
})
我的问题出在 html,我之前向 div 元素添加了自定义 onclick
事件,但此事件与 Vuejs 事件冲突。
有一种情况,我必须在 vuejs 中的第一个 ajax(在 mounted
函数中)之后获取额外的数据,我将第二个 ajax 放在 if
条件和第一个 ajax!
success
函数
它正在工作,我在 chrome 中看到 Vue Devtools 中的数据,但数据未在视图中呈现。
伪代码:
var vm = new Vue({
el: '#messages',
data: {
participants: [],
active_conversation: '',
messages: []
},
methods: {
getParticipants: function () {
return this.$http.post('message/get-participants').then(
function (response) {
vm.participants = response.data.participants;
// if there is a conversation_id param in url
if (getUrlParameterByName('conversation_id')) {
// Second Ajax Is Called Here inside First Ajax
return vm.getConversationMessages (getUrlParameterByName('conversation_id')); // this ajax call is getting data but not showing in view
}
}
},
getConversationMessages : function(conv_id){
// Second Ajax Call to get Conversation messages
// and showing them , works onClick
return this.$http.post('message/get-messages/' + conv_id).then(
function (response) {
if (response.data.status == 'success') {
console.log(response.data.messages)
vm.messages = response.data.messages;
vm.$forceUpdate();
}
},
mounted: function () {
this.getParticipants()
}
})
第二个 Ajax 获取特定对话消息的调用正在响应 onclick
事件并显示消息,但是当在第一个 Ajax 成功响应中使用此功能时(getParticipants()
),它正确获取数据,我可以在 DevTools VueJs 扩展中看到消息已设置但视图不显示消息,我已经尝试 vm.$set()
但没有机会。
更新:
第二个 Ajax 没有错误,消息数据 属性 已填充(我检查了 Vue DevTools),唯一的问题是视图不显示消息!!但是当我通过单击对话手动执行此操作时,第二个 ajax 再次执行,我可以看到消息!,我也在第二个 ajax 之后尝试 vm.$forceUpdate()
没有机会。
Update2 html部分(错误在这里!!)
<a vbind:id="conv.id" v-on:click="getMessages(conv.id)" onclick="$('#user-messages').addClass('active')">
当您仅使用 getConversationMessages
而不放置 ajax 请求时,DOM 会更新消息
getParticipants
的ajax请求的成功回调中的getConversationMessages
就是在这一行遇到错误
this.participants = response.data.participants;
您在 ajax 请求的成功回调中使用了普通函数,这就是 this
未指向 vue 实例的原因
adnd this.participants
给你一个未定义的错误。所以使用 vm
而不是指向 vue 实例,就像你在程序的其余部分所做的那样
vm.participants = response.data.participants;
编辑
var vm = new Vue({
el: '#messages',
data: {
participants: [],
active_conversation: '',
messages: []
},
methods: {
getParticipants: function () {
return this.$http.post('message/get-participants');
},
getConversationMessages : function(conv_id){
return this.$http.post('message/get-messages/' + conv_id);
}
},
mounted: function () {
this.getParticipants().then(function (response){
vm.participants = response.data.participants;
if (getUrlParameterByName('conversation_id')) {
return vm.getConversationMessages (getUrlParameterByName('conversation_id')); // this ajax call is getting data but not showing in view
}
}).then(function(response){
if (response.data.status == 'success') {
console.log(response.data.messages)
vm.messages = response.data.messages;
});
}
})
在使用 http 回调完成第一个 http 请求后调用第二个 http 请求,或者您也可以使用 Promise。
return this.$http.post(function(response){
// first call
}).then(function(response){
// Second call
})
new Vue({
el: '#messages',
data: {
participants: [],
active_conversation: '',
messages: []
},
methods: {
async getParticipants (id) {
var response = await this.$http.post('message/get-participants')
this.participants = response.data.participants
if (id) this.getConversationMessages(id)
},
async getConversationMessages (id) {
var response = this.$http.post('message/get-messages/' + id)
if (response.data.status === 'success') {
console.log(response.data.messages)
this.messages = response.data.messages;
}
}
},
created () {
this.getParticipants(getUrlParameterByName('conversation_id'))
}
})
我的问题出在 html,我之前向 div 元素添加了自定义 onclick
事件,但此事件与 Vuejs 事件冲突。