2017-01-25 8 views
1
gefasst

Ich versuche Liste von Daten vom Server zu erhalten und zeigen, aber sieht aus wie Vue kein neue Daten sehen (sie nicht reaktiv machen)Vue2 Objekt nicht

 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", 
}); 

Auch ich versuche

zu verwenden

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

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

aber es ist immer noch nicht für mich arbeiten. Danke fürs Helfen!

Antwort

1

Sie verlieren den Kontext sowohl in then als auch in catch Callbacks. Als Ergebnis setzen Sie window.videos Variable (global) statt Ihrer Komponenteninstanz videos Eigenschaft (gleich mit error).

Einfach fix ist arrow functions zu verwenden, die lexikalische Bindung erhalten:

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

Dank ihm helfen. Aber warum kann ich es nicht schreiben ohne diese ES2015 Antwort => ??? von axios docs 'axios.get (? '/ User ID = 12345') .then (function (response) { console.log (response); }) .catch (function (Fehler) { console.log (Fehler); }); ' –

+1

Weil, wenn Sie anonyme Funktion verwenden 'Funktion (Antwort) {console.log (Antwort); } 'Ausführungskontext ist globales Objekt (' window'). Es ist in Ordnung, wenn Sie "console.log" möchten, aber in Ihrem Fall möchten Sie die Eigenschaft Ihrer Komponente festlegen, so dass Sie das richtige "this" haben müssen. '.dann (Funktion (Antwort) {this.videos = response.data.videos;} .bind (this))' würde funktionieren. Oder Sie können auch eine Referenz darauf speichern und sie im Callback verwenden: const self = this; ... .dann (function (response) {self.videos = response.data.videos;}) '. – dfsq

Verwandte Themen