firebase - 在 firebase.auth().onAuthStateChanged 中使用 Provider 返回 undefined
问题描述
我尝试调用一个函数,它是 Provider 的一部分,但我注意到当调用在 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');
}
});
我确信我错过了一些东西,并感谢一些帮助谢谢!
解决方案
好的,我找到了解决方案
解释:都是关于“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 :) */
})
推荐阅读
- typescript - 如何获取 OneSignal playerID
- python - 如何检查数组在多维数组中是否可用
- google-apps-script - 使用脚本从 Gsheet 模板更新 Google Sheet 单元格
- php - 我只想要一些 $row 数据,其中一些只显示一次不显示所有数据,因为所有数据都相同且不需要 .. 我在 codeigniter 工作
- jaas - Activemq Artemis 控制台证书认证
- drake - 了解代数环错误消息
- reinforcement-learning - 具有函数逼近和资格迹的强化学习
- javascript - 在Firefox中验证数字期间退格不起作用
- swift - 平滑 UIBezierPath
- arrays - Array.append 更改以前添加的值 - swift 4.0