这是合约。 我正在使用VueFire,并希望从我设置的Firebase数据库中检索数据。在那里,我有一个用户节点,每个节点都由一个唯一的id定义。同样对于每个用户我都有一个装满购物车的购物车阵列。为了使它动态,我在firebase钩子中调用引用,如下所示:
export default {
firebase:{
cart: app.database().ref('users')
}, //and so on and so on
}
而不是.ref('users')
我想要检索当前用户,使用他的唯一ID,如:.ref('users/' + user.uid + '/cart')
为了获得当前用户的uid,我做了firebase.auth().onAuthStataChanged(user=>{//code here})
的观察者
问题是,因为这是异步的,所以在检索当前用户之前激活firebase钩子。我试图简单地调用firebase.auth().currentUser
,但这也很慢并且不可靠。
我愿意接受各种建议!
答案 0 :(得分:0)
我制作了一个适用于我的案例的解决方案,可能为你的工作。
我做的是在用户进行身份验证时附加值侦听器,然后在用户失去身份验证时将其关闭。使用这种方法,如果用户实际经过身份验证,我只需要检索用户数据。以下是我的表现方式:
this.$root.firebase.auth().onAuthStateChanged(user => {
if (user) {
this.$store.dispatch('setUserUID', user.uid)
// Listen for User Data
let dataRef = this.$root.db.ref('/userdata/' + user.uid)
let self = this
dataRef.on('value', function(snap) {
let value = snap.val()
self.$store.dispatch('setUserData', value)
})
}
else {
// Stop Listening for User Data
this.$root.db.ref('/userdata/' + this.$store.state.user.uid).off()
this.$store.dispatch('setUserUID', null)
}
})
答案 1 :(得分:0)
好的,我明白了。感谢@Daniel D关于绑定作为数组或对象的提示。因此事实证明我不必在firebase引用钩子中执行它,我只需要将它作为数组绑定在mounted()
钩子中。我只是在数据中声明一个空cart: []
,然后像这样填充它:
<script>
import changeColorMixin from '../mixins/changeColorMixin'
import animateFunction from '../mixins/animationMixin'
import Firebase from 'firebase'
import app from '../firebaseApp'
export default {
data(){
return{
isLoggedIn: '',
cart: []
}
},
methods:{
changeColor: changeColorMixin,
animateEntrance: animateFunction,
promptLogin: function(){
console.log('you need to login!');
},
chooseSize: function($event){
$($event.target).parents().eq(2).addClass('chosen');
},
closeOrder: function($event) {
$($event.target).parents().eq(2).removeClass('chosen');
},
makeOrder: function($event){
var $this = this;
Firebase.auth().onAuthStateChanged(function(user){
if(user){
var cartRef = app.database().ref('users/' + user.uid + '/cart');
var currentCart;
cartRef.once('value', function(result) {
currentCart = result.val();
var size = $($event.target).html();
var name = $($event.target).parents().eq(2).attr('id');
app.database().ref('users/' + user.uid + '/cart/' + name + '/count').once('value', function(snap){
var count = snap.val();
if(count > 0){
count = count + 1;
}else{
count = 1;
}
cartRef.child(name).set({
size: size,
count: count,
name: name
});
});
});
}else{
console.log('gotta login mate');
}
});
}
},
mounted(){
Firebase.auth().onAuthStateChanged(user => {
if(user){
this.isLoggedIn = true;
var cartRef = app.database().ref('users/' + user.uid + '/cart');
this.$bindAsArray('cart', cartRef);
}else{
this.isLoggedIn = false;
}
});
this.animateEntrance();
this.changeColor();
}
}
</script>
我非常感谢@Daniel D