76 votes

VueJS accédant à une méthode à partir d'une autre méthode

J'utilise VueJS pour créer un jeu/interface de gestion des ressources assez simple. Pour l'instant, je cherche à activer la fonction roll toutes les 12,5 secondes et utiliser le résultat dans une autre fonction. Pour l'instant, je continue à obtenir l'erreur suivante :

Erreur de Type Non Rattrapée : Impossible de lire la propriété 'roll' de undefined(...)

J'ai essayé :

  • app.methods.roll(6);
  • app.methods.roll.roll(6);
  • roll.roll()
  • roll()

mais je ne parviens pas à accéder à la fonction. Quelqu'un a-t-il une idée de la façon dont je pourrais y parvenir ?

methods: {

  // Push responses to inbox.
  say: function say(responseText) {
    console.log(responseText);
    var pushText = responseText;
    this.inbox.push({ text: pushText });
  },

  // Roll for events
  roll: function roll(upper) {
    var randomNumber = Math.floor(Math.random() * 6 * upper) + 1;
    console.log(randomNumber);
    return randomNumber;
  },

  // Initiates passage of time and rolls counters every 5 time units.
  count: function count() {
    function counting() {
      app.town.date += 1;
      app.gameState.roll += 0.2;

      if (app.gameState.roll === 1) {
        var result = app.methods.roll(6);
        app.gameState.roll === 0;
        return result;
      }
    }

    setInterval(counting, 2500);

    ...

    // Activates the roll at times.
  }
}

0 votes

Où essayez-vous d'accéder au roll ? Est-ce à l'intérieur du même composant ? Dans un composant enfant ? Dans un composant parent ? Un frère ou une sœur ? Ou à un autre endroit avec une relation compliquée ?

0 votes

Pas du tout de composants pour le moment. J'active la méthode de comptage au chargement de la page, et à l'intérieur de la méthode de comptage, je cherche à activer la méthode de roulement. L'appel se fait dans l'instruction if de la fonction counting(). Pour l'instant, tout se trouve dans la portée Root. Je vais refactorer vers les composants une fois que j'aurai terminé la fonctionnalité de base.

154voto

Wing Points 2317

Vous pouvez accéder à ces méthodes directement sur l'instance VM, ou les utiliser dans des expressions de directive. Toutes les méthodes auront leur this automatiquement lié à l'instance Vue.

- Guide de l'API Vue sur methods

Au sein d'une méthode d'une instance Vue, vous pouvez accéder à d'autres méthodes de l'instance à l'aide des éléments suivants this .

var vm = new Vue({
  ...
  methods: {
    methodA() {
      // Method A
    },
    methodB() {
      // Method B

      // Call `methodA` from inside `methodB`
      this.methodA()
    },
  },
  ...
});

Pour accéder à une méthode en dehors d'une instance Vue, vous pouvez assigner l'instance à une variable (telle que vm dans l'exemple ci-dessus) et appelez la méthode :

vm.methodA();

17 votes

Je suis capable d'accéder aux données en utilisant this mais pas les méthodes. Quelque chose a-t-il changé dans Vuejs 2.0 ?

0 votes

@SumitMurari : comment définissez-vous la méthode sur le composant ? La réponse ci-dessus est valable pour Vue 2.

7 votes

Je faisais une erreur, j'ai fait un appel ajax et j'essayais d'accéder aux méthodes de l'application via this et var self = this; self.method() a fonctionné pour moi.

2voto

Vous pouvez utiliser vm.methodName();

Ejemplo:

let vm = new Vue({
  el: '#app',
  data: {},
  methods: {
    methodA: function () {
      console.log('hello');
    },
    methodB: function () {
      // calling methodA
      vm.methodA();
    }
  },
})

1voto

SagitSri Points 333
let vm = new Vue({
  el: '#testfunc',
  data:{
    sp1: "Hi I'm textbox1",
    sp2: "Hi I'm textbox2"
  },
  methods:{
    chsp1:function(){
      this.sp1 = "I'm swapped from textbox2"
    },
    chsp2:function(){
      this.sp2 = "I'm swapped from textbox1";
      this.chsp1();
    },
    swapit:function(){
      this.chsp2();
    }
  }
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="testfunc">
  <input type="text" :value="sp1"></span>
  <input type="text" :value="sp2"></span>
  <button @click="swapit()">Swap</button>
</div>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X