vue JS ajax внутри другого ajax получает данные, но не рендеринг

есть ситуация, что я должен получить дополнительные данные после моего первого ajax (в mounted функция) в vuejs я поставил второй ajax в if состояние и внутри success функция первого ajax!

он работает, и я вижу данные в Vue Devtools в chrome, но данные не отображаются в поле зрения.

Псевдо Код:

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 выполняется снова, и я вижу сообщения!, Я также пробовал vm.$forceUpdate() после второго ajax без шансов.

Update2 html часть(ошибка здесь!!)

<a vbind:id="conv.id" v-on:click="getMessages(conv.id)" onclick="$('#user-messages').addClass('active')">

4 ответов


DOM обновляется сообщениями, когда вы выполняете запрос ajax только с getConversationMessages и не поставив getConversationMessages в успешном обратном вызове ajax-запроса getParticipants тот факт, что ошибка возникает в этой строке

this.participants = response.data.participants;

вы используете нормальную функцию в успешном обратном вызове запроса ajax, что является причиной this не указывает на экземпляр vue adnd this.participants дает вам неизвестная ошибка. Так что используйте vm insteaad, чтобы указать на экземпляр 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 или вы можете использовать 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, мой товарищ по команде, который не знает vuejs добавил onclick событие для активации области сообщений (показать сообщения div) рядом с my v-on:click, поэтому область сообщений активна только тогда, когда пользователь нажимает на разговор, а не при попытке получить их внутри первого ajax!

я обновил свой вопрос, чтобы показать часть html, которая вызывает проблему.

спасибо всем