0

這是交易。 我正在使用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,但這也很慢並且不可靠。 我很樂意接受各種建議!

+1

你需要這樣您異步綁定參考,*後接線起來*'onAuthStateChanged'激發。你必須等待它才能準確地知道用戶ID和用戶是否登錄。 –

+0

我有類似的問題,我正在用'firebase.auth()。currentUser'這樣做:我嘗試在'created()'上檢查'uid',並設置它,然後設置它。然後,使用'this.uid'而不是'firebase.auth()。currentUser.uid',但沒有奏效。如果有的話,我也在尋找更好的解決方案。 –

回答

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) 
    } 
}) 
+0

在哪個鉤子應該去?或者可能在'export default'之前?因爲我需要將ref附加到Firebase綁定。 –

+0

當用戶通過身份驗證時,您可以手動創建VueFire綁定,如其文檔中所述。因此,在'onAuthStateChanged'中,你檢查是否有'user',如果有,你會執行'vm。$ bindAsObject('user',myFirebaseRef.child('user'))'然後如果沒有用戶,可以做'vm。$ unbind('items')' –

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

+0

不客氣。請記住投票支持你的評論!謝謝! –

+0

沒有足夠的聲譽,對不起 –