2017-01-25 4 views
1

Я пытаюсь получить список данных с сервера и показать его, но выглядит как Vue не видят новые данных (не делает их реактивными)объекта Vue2 не выставиться

 Vue.component('Videos', { 
      template: 
       ` 
       <div> 
        <div v-for="video in videos" v-text="video.name"> 
        </div> 
       <div> 
      `, 
      data() { 
       return { 
        videos: {}, 
       } 
      }, 
      methods: { 
       getVideos() { 
        axios.get('/admin/videos?token='+localStorage.getItem('auth_token')) 
         .then(function(response) { 
          this.videos = response.data.videos; 
         }).catch(function(errors){ 
          this.error = errors.data; 
        }) 
       }, 
      }, 
      created: function() { 
       this.getVideos(); 
      } 

     }); 

    new Vue({ 
     el: "#app", 
}); 

Также я стараюсь использовать

Object.keys(response.data.videos).forEach( key => this.$set(this.videos, key, response.data.videos[key]) );

и this.videos = Object.assign({}, this.videos, response.data.videos)

, но это все еще не работает для меня. Спасибо за помощь!

ответ

1

Вы теряете контекст как в обратных вызовах then, так и в catch. В результате вы устанавливаете window.videos переменную (глобальную) вместо экземпляра компонента videos (то же самое с error).

Простое исправление заключается в использовании arrow functions, сохраняющие лексического связывание:

methods: { 
    getVideos() { 
     axios.get('/admin/videos?token='+localStorage.getItem('auth_token')) 
      .then(response => { 
       this.videos = response.data.videos; 
      }).catch(errors => { 
       this.error = errors.data; 
     }) 
    }, 
}, 
+0

Спасибо это поможет. Но почему я не могу написать это без ответа ES2015 => ??? из AXIOS Документов 'axios.get ('?/Идентификатор пользователя = 12345') .then (функция (ответ) { console.log (ответ); }) .catch (функция (ошибка) { console.log (ошибка); }); ' –

+1

Потому что, когда вы используете анонимную функцию' function (response) {console.log (response); } 'контекст выполнения - это глобальный объект (' window'). Это нормально, если вы хотите 'console.log', но в вашем случае вы хотите установить свойство своего компонента, поэтому вам нужно иметь правильное' this'. '.then (function (response) {this.videos = response.data.videos;} .bind (this))' будет работать. Или вы также можете сохранить ссылку на это и использовать его внутри обратного вызова: 'const self = this; ... .then (function (response) {self.videos = response.data.videos;}) '. – dfsq

Смежные вопросы