Вызов функции Angular Cant внутри FB.api () - PullRequest
0 голосов
/ 26 ноября 2018

У меня проблема с Facebook API в Angular 6: я не могу выполнить или изменить значение переменной внутри функции FB.api

Я пытаюсь перезаписать поля формыс данными, полученными из facebook, но когда я хочу исправить значения, я получаю Cannot read property 'patchValue' of undefined

Это моя кнопка:

<button type="button" class="btn" (click)="submitLogin();">Login with facebook</button>

component.ts

/* ... angular imports ... */

declare const FB: any;

export class CouponsComponent implements OnInit {

  forma: FormGroup;
  showForm: boolean = false;
  usuario: any;

  /* more code ... */

  ngOnInit() {

    (window as any).fbAsyncInit = function() {
      FB.init({
                appId      : {api-key},
                cookie     : true,
                xfbml      : true,
                version    : 'v3.2'
            });
            FB.AppEvents.logPageView();
    };

    (function(d, s, id){
            var js, fjs = d.getElementsByTagName(s)[0];
            if (d.getElementById(id)) {return;}
            js = d.createElement(s); js.id = id;
            js.src = "https://connect.facebook.net/es_LA/sdk.js";
            fjs.parentNode.insertBefore(js, fjs);
        }(document, 'script', 'facebook-jssdk'));

  }

  submitLogin(){

    FB.login((response)=> {

      if (response.status === 'connected') {        

                FB.api('/me', {fields: 'last_name, name, email'}, function(response) {

                    if (response) {
                        this.usuario = response;

                    this.forma.patchValue({ // -> get Cannot read property 'patchValue' of undefined
                        nombre: this.usuario.name + ' ' + this.usuario.last_name,
                        email: this.usuario.email,
                    })

                        console.log(this.usuario); // -> get fine response
                        console.log(this.forma); // -> get undefined
                    }

                });

                setTimeout(() => {
                    console.log(this.usuario); // -> get undefined
                }, 3000)

            } else {
                console.log('User cancelled login or did not fully authorize.');
            }
      });
  }


}

1 Ответ

0 голосов
/ 26 ноября 2018

this больше не является ссылкой на компонент в области действия api.Лучший способ получить ссылку на компонент - это при submitLogin объявить cost self = this; и позже вместо this.forma.patchValue call self.forma.patchValue.

Вы также можете вместо function(response) сделать (response)=>, таким образом, он не будет создавать новую область, и this будет компонентом.

...