I’m building a custon social login page for my web application, and I’m stuck with a bug I can’t find why it’s hapenning .
Basically, I want to call a function called “connectFb” and then if all the Facebook API calls are successful, I would like to change a bunch of data in my vue instance in order to render other elements . (those are rendred conditionally via v-if)
Here’s the part of my code responsible for this :
app = new Vue({
el : "#social-auth",
data: {
showTwitter : false,
showFb: true,
showPages: false,
fb_state: "unconnected",
continue_auth: false,
pages_fb: []
},
methods : {
connectFb: function() {
FB.login(function(response) {
if (response.authResponse) {
alert('You are logged in & cookie set!');
fb_token = response.authResponse.accessToken
FB.api('/me/accounts','get',{access_token: fb_token},function(pages){
if(pages["error"] !== undefined){
console.log('EROR')
}
else{
console.log("Got a list of pages");
console.log(pages);
this.pages_fb = pages.data;
this.showFb = false;
this.showPages = true;
this.continue_auth = true;
}
})
} else {
alert('User cancelled login or did not fully authorize.');
}
},{scope: 'public_profile,manage_pages'});
return false;
}
How The Code Works :
Basically, after the user is logged in to fb, it will get a list of his pages, this is not the problem, the problem is in the success callback after it (the callback related to the function fetching pages) . using the debugger I could see that the variable pages contains all the data I need and pages.data return an array of those pages info .
After this I’m trying to attribute it to my instance variable called pages_fb . when this code run pages_fb
is always empty even though pages.data
is not .
The problem is not only with pages_fb but also with all my instance variable that should change in the callback they are the same after the callback run .
I’m getting mad at this problem, so please help me understand what’s wrong .
2
Answers
Extremely common mistake.
this
defined in yourFB.login
callback is not the Vue. Use an arrow function, closure, orbind
to make it correct.See How to access the correct
this
inside a callback?When you use
this.
in a callback it isn’t pointing to your Vue instance anymore. You can user=>
functions to bind this the way you want. Try this: