J'utilise vue.js dans ce cas, mais je suppose que cela s'appliquerait également en JS brut. Le problème est que lorsque je suis dans une fonction qui est dans une autre fonction, je dois appeler des variables par leur chemin complet comme - Object.variable au lieu de this.variable. Existe-t-il un moyen d'utiliser this.timer, this.pages au lieu de TVComponent.pages etc.
const TVComponent = new Vue ({
el: '.tvContent',
data:
{
current_page: 0,
timer: 0,
pages: [
{ page: '/', interval: 10 },
{ page: 'tv/calls', interval: 10 },
{ page: 'tv/general', interval: 10 }
]
},
methods:
{
tvTimer()
{
setInterval(function() {
TVComponent.timer++;
if (TVComponent.timer == TVComponent.pages[TVComponent.current_page].interval) {
console.log('it is time!!');
}
console.log(TVComponent.pages[TVComponent.current_page].page);
}, 1000);
},
})
4 Réponses :
Je pense que vous devez le lier dans ce contexte. Nous le faisons de cette façon dans React classess.
comment le liez-vous?
Vous pouvez utiliser data.timer qui est un meilleur moyen
La fonction que vous passez à setInterval reçoit son propre contexte, cependant si vous utilisez une fonction de flèche, elle utilisera le contexte actuel à la place, et ignorera celui donné par setInterval .
setInterval(() => { ... }, 1000)
Problème classique de ceci n'étant pas ce à quoi vous vous attendez dans une fonction
A. liez-le
methods:
{
tvTimer()
{
setInterval(() => {
this.timer ...
}, 1000);
},
})
B. utiliser une fermeture
methods:
{
tvTimer()
const _this = this
{
setInterval(function() {
_this.timer ...
}, 1000);
},
})
C. utiliser une fonction fléchée
methods:
{
tvTimer()
{
setInterval(function() {
// ...
}.bind(this), 1000);
},
})
C'est une de ces choses qu'il faut vraiment comprendre à propos de JS afin de ne pas tomber indéfiniment dans différents lieux. Je suggère cet ebook:
https://github.com/getify/You-Dont-Know-JS/blob/master/up%20%26%20going/ch2.md#this-identifier
Merci, je ne connaissais pas les fonctions de reliure et de flèche. Auront besoin de lire à ce sujet!
Ceci est dû au fait que setInterval () cet objet n'est pas le même que vue.js this , car ils ont des portées différentes.
Essayez d'assigner cet objet à une nouvelle variable avant d'entrer dans la portée de la fonction problématique.
let self = this;
tvTimer()
{
setInterval(function() {
self.timer++;
if (self.timer == self.pages[self.current_page].interval) {
console.log('it is time!!');
}
console.log(self.pages[self.current_page].page);
}, 1000);
},
Voir: https : //developer.mozilla.org/en-US/docs/Glossary/Scope