IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VueJS Discussion :

Redéfinir la valeur d'une propriété d'un composant sur un appel axios


Sujet :

VueJS

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Redéfinir la valeur d'une propriété d'un composant sur un appel axios
    Bonjour,

    Voila je rencontre un petit problème avec mon code. J'ai crée un composant autocomplete, il fonctionnait bien avec une valeur en dur mais je cherche à le mettre à jour avec une requête axios

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    <script>
        import axios from 'axios';
     
        export default {
            name: 'autocomplete',
            props: {
                isAsync: {
                    type: Boolean,
                    required: false,
                    default: false,
                },
            },
            data() {
                return {
                    items: [],
                    isOpen: false,
                    results: [],
                    search: '',
                    isLoading: false,
                    arrowCounter: 0,
                };
            },
            methods: {
                onChange() {
                    // Let's warn the parent that a change was made
                    this.$emit('input', this);
     
                    // Is the data given by an outside ajax request?
                    if (this.isAsync) {
                        this.filterResults();
                        this.isLoading = true;
                    } else {
                        // Let's  our flat array
                        this.filterResults();
                        this.isOpen = true;
                    }
                },
     
                filterResults() {
                    // first uncapitalize all the things
                    this.results = this.items.filter((item) => {
                        return item.toLowerCase().indexOf(this.search.toLowerCase()) > -1;
                    });
                },
                setResult(result) {
                    this.search = result;
                    this.isOpen = false;
                },
                onArrowDown(evt) {
                    if (this.arrowCounter < this.results.length) {
                        this.arrowCounter = this.arrowCounter + 1;
                    }
                },
                onArrowUp() {
                    if (this.arrowCounter > 0) {
                        this.arrowCounter = this.arrowCounter -1;
                    }
                },
                onEnter() {
                    this.search = this.results[this.arrowCounter];
                    this.isOpen = false;
                    this.arrowCounter = -1;
                },
                handleClickOutside(evt) {
                    if (!this.$el.contains(evt.target)) {
                        this.isOpen = false;
                        this.arrowCounter = -1;
                    }
                }
            },
            watch: {
                items: function (val, oldValue) {
                    // actually compare them
                    if (val.length !== oldValue.length) {
                        this.results = val;
                        this.isLoading = false;
                    }
                },
            },
            mounted() {
                document.addEventListener('click', this.handleClickOutside)
                axios.get(`http://jsonplaceholder.typicode.com/posts`)
                    .then(function(response){
                        for (var i = 0; i < response.data.length; i++) {
                            console.log(this);
                            //this.items.push(response.data[i].title)
                        }
                    })
            },
            destroyed() {
                document.removeEventListener('click', this.handleClickOutside)
            }
        };
    </script>
     
    <template>
        <div id="fake-input-block"  class="autocomplete" >
     
            <input
                    id="fake-game-input"
                    type="text"
                    @input="onChange"
                    v-model="search"
                    @keydown.down="onArrowDown"
                    @keydown.up="onArrowUp"
                    @keydown.enter="onEnter"
                    class="form-control"
     
            />
            <span>
                <a id="add-game" href="#" class="white" >Ajouter</a>
            </span>
     
            <ul
                    id="autocomplete-results"
                    v-show="isOpen"
                    class="autocomplete-results"
                    style="list-style-type: none;
                        background: #FFFFFF; color: #222222;"
     
            >
                <li
                        class="loading"
                        v-if="isLoading"
                >
                    Loading results...
                </li>
                <li
                        v-else
                        v-for="(result, i) in results"
                        :key="i"
                        @click="setResult(result)"
                        class="autocomplete-result"
                        :class="{ 'is-active': i === arrowCounter }"
                >
                    {{ result }}
                </li>
            </ul>
        </div>
    </template>
    mais le console.log ne me renvoit qu’un undefined alors que ce devrait être un tableau

    merci d'avance

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    je vais enquêter pour comprendre ce qui fait que dans le bloc then de la promesse tu n’as pas accès au this, en tout cas le fait est que ça marche nickel quand on fait un const that = this avant l’appel axios et qu’on travaille sur ce that

  3. #3
    Membre expérimenté
    Avatar de gwyohm
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    925
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 925
    Points : 1 333
    Points
    1 333
    Par défaut
    Salut, je pense que si tu passes par une arrow function, ca va fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     mounted() {
                document.addEventListener('click', this.handleClickOutside)
                axios.get(`http://jsonplaceholder.typicode.com/posts`)
                    //.then(function(response){
                    .then((response) =>{
                        for (var i = 0; i < response.data.length; i++) {
                            console.log(this);
                            //this.items.push(response.data[i].title)
                        }
                    })
            },
    on ne dit pas "ça ne marche pas" on dit "je suis incapable de faire fonctionner correctement les outils mis à ma disposition"
    Pas de question technique par MP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VS2005] Changer le texte des valeurs d'une propriété
    Par belfaigore dans le forum VB.NET
    Réponses: 2
    Dernier message: 13/02/2008, 17h08
  2. rendre globale la valeur d'une propriété..
    Par islamune9 dans le forum VB.NET
    Réponses: 10
    Dernier message: 10/05/2007, 22h56
  3. [VB.NET]Héritage : valeur d'une propriété perdue
    Par denilson dans le forum Windows Forms
    Réponses: 1
    Dernier message: 06/07/2006, 11h50
  4. Récupération valeur d'une propriété type TStrings
    Par Stéphane Vaillant dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2003, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo