Использование провайдера внутри firebase.auth (). OnAuthStateChanged return undefined - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь вызвать функцию, которая является частью от провайдера, но я заметил, что когда вызов находится внутри firebase.auth().onAuthStateChanged функции, все провайдеры не определены.

@Ionic3.9.2 @ cordova-8.1.2 (cordova-lib@8.1.1)

Это мой код:

constructor(public global:global,public navCtrl: NavController, public navParams: NavParams, public app: App, public dataProvider: DataProvider,
        public loadingProvider: LoadingProvider, public alertProvider: AlertProvider, public alertCtrl: AlertController, public firebaseProvider: FirebaseProvider, public modalCtrl: ModalController) { }

    ionViewDidLoad() {
        console.log(this.dataProvider);




        firebase.auth().onAuthStateChanged(function (user) {
            if (user) {
                // User is signed in.
                console.log(user);
                this.currentUser=user;
                this.tab = "friends";
                this.title = "Friends";

                this.searchFriend = '';

                console.log(this.dataProvider); /*   -> undefined*/
                if (this.dataProvider.getRequests(this.currentUser != null)) {  /* the console return to me an error  :TypeError: Cannot read property 'getRequests' of undefined */
                    console.log(this.dataProvider.getRequests(this.currentUser));
                    // console.log(this.dataProvider.getRequests(firebase.auth().currentUser.uid));
                    console.log("if ");

                    // console.log(this.currentUser.uid);
                    console.log(this.currentUser);
                    this.dataProvider.getRequests(this.currentUser.uid).snapshotChanges().subscribe((requestsRes) => {
                        let requests = requestsRes.payload.val();
                        console.log(requests);
                        if (requests != null) {
                            if (requests.friendRequests != null && requests.friendRequests != undefined)
                                this.friendRequestCount = requests.friendRequests.length;
                            else this.friendRequestCount = 0
                        }
                        else this.friendRequestCount = 0;
                        console.log(this.friendRequestCount);
                    });

                    this.getFriends();
                }
            } else {
                // No user is signed in.
                console.log('no User');
            }
        });

Я уверен, что что-то упустил и буду благодарен за помощь Спасибо!

1 Ответ

0 голосов
/ 20 апреля 2019

Хорошо, я нашел решение

Объяснение: Все дело в ключевом слове "this"

this.dataProvider в обратном вызове не совпадает с this.dataProvider вне функции обратного вызова.

Чтобы ссылаться на один и тот же this.dataProvider внутри и снаружи функции обратного вызова, вам просто нужно создать функцию и передать dataProvider в качестве параметра.

constructor(public global:global,public navCtrl: NavController, public navParams: NavParams, public app: App, public dataProvider: DataProvider,
        public loadingProvider: LoadingProvider, public alertProvider: AlertProvider, public alertCtrl: AlertController, public firebaseProvider: FirebaseProvider, public modalCtrl: ModalController) { 
this.ionViewDidLoad(this.dataProvider); // <--- with this (mandatory)
}
    ionViewDidLoad(dataProvider: DataProvider) {
        console.log(dataProvider); // <-- defined with or without this
        firebase.auth().onAuthStateChanged(function (user) {
         .........

                console.log(dataProvider); /* without this  -> NOT undefined anymore :) */

       })
...