2017-05-12 5 views
0

ich separate Klasse für axios Anfragen machen wollen, die wie "Service" arbeitetKlasse Import in Vue Komponente

Vue Komponente:

<template> 
    <div v-for="user in users"> 
     {{ user.firstname }} - {{ user.lastname }} - {{ user.middlename }} 
    </div> 
</template> 

<script> 
    import ConnectionService from './ConnectionService'; 
    const connectionService = new ConnectionService(); 

    export default { 
     mounted() { 
      console.log('Component is mounted'); 
     }, 

     created() { 
      this.users = connectionService.getSingleInstance('http://laravelapi/user'); 
      console.log("This are users " + this.users); 
     }, 

     data() { 
      return { 
       users: [], 
      } 
     } 
    } 
</script> 

und der Service ist folgende:

export default class ConnectionService { 

    getSingleInstance(path) { 
     console.log('This is path ' + path); 

     let axios_data = {}; 
     axios.get(path).then(response => axios_data = response.data.result); 

     console.log('This is data ' + axios_data); 
     console.log(axios_data); 

     return axios_data; 
    } 


} 

Wie ich in meiner Konsole sehen kann, bekomme ich die Daten von axios xhr Anfrage, aber dann werden sie nicht an die Vue-Komponente übergeben, weil ich leere Objekt in der Zeichenfolge console.log ("Das sind Benutzer" + dies). Benutzer);

Wie COnnectionService richtig importieren und dann in Vue-Komponente verwenden?

Antwort

1

Ändern der nächste in Ihrer vue Komponente:

created() { 
    connectionService.getSingleInstance('http://laravelapi/user') 
     .then(function(response){ 
      this.users = response 
      console.log("This are users " + this.users); 
     }) 
     .catch(function(error){ 
      console.log(error) 
     }); 
} 

Wie getSingleInstance ein Objekt zurückgibt Ich empfehle Benutzer wie folgt erklärt: user: Object oder user: {} statt user: []

Es scheint, dass Sie Versprechen verwenden, weil .get ist eine asynchrone Funktion. So installieren Q verspricht Paket sehen: Q

Wie in Ihrem Beispiel verwenden:

import Q from 'q' 

export default class ConnectionService { 
    getSingleInstance(path) { 
     var deferred = Q.defer() 
     console.log('This is path ' + path); 

     axios.get(path) 
      .then(
       function(response) { 
        deferred.resolve(response.data.result) 
       }, 
       function(error){ 
        deferred.reject(error) 
       }) 
     return deferred.promise 
    } 
} 

Wie man sehen kann ich den Pfeil Syntax geändert haben (=>), weil ich eher wie dieses klären.

Ich kann es nicht testen und ich bin kein Experte (ich versuche nur zu helfen), aber ich denke, es sollte funktionieren.

+0

Versucht, dies zu tun, aber den folgenden Fehler erhalten: app.js: 34877 [Vue warnen]: Fehler in erstellten Hook: "TypeError: connectionService.getSingleInstance (...). Dann ist keine Funktion" – ILya

+0

@ILya Ich habe meine Antwort bearbeitet (ich weiß nicht, ob es funktioniert), aber auf jeden Fall denke ich, dass es ein Problem aufgrund der asynchronen Funktion ist, und Sie können nach Informationen suchen, um es zu lösen. – ricopo