2015-12-06 18 views
2

我正在用Firebase構建Angular中的應用程序,其中一方面是一對一聊天。我正在查詢Firebase,看看當前正在訪問應用程序的用戶和他們正在嘗試聊天的用戶之間是否已經存在聊天室。如果存在,我試圖將該房間作爲選定的房間應用於該範圍。我正在使用「消息」服務來運行查詢。在angularjs中觀看Firebase查詢

this.roomQuery = function(user1ID, user2ID) { 
    roomsRef.orderByChild("user1").equalTo(user1ID).on("child_added", function(snapshot) { 

    if (snapshot.val().user2 == user2ID) { 
     self.selectedRoom = snapshot.key(); 
     console.log(self.selectedRoom); 
    } else { 
     self.selectedRoom = null; 
    } 


    }) 
} 

,並在我的控制,我使用:

$scope.$watch(
    function(){ return Messages.selectedRoom }, 

    function(newValue, oldValue) { 
     $scope.selectedRoom = newValue; 
    } 
    ) 

$scope.$watch方法很適合我用一切,似乎在這種情況下有時工作。控制檯日誌總是輸出Messages.selectedRoom的正確值,但$ scope.selectedRoom有時不會更新。有什麼想法發生在這裏?我很困惑。如果它正確地登錄到控制檯,它不應該在範圍中更新嗎?

+0

我認爲這與異步加載的Firebase數據有關,但我不明白爲什麼Messages.selectedRoom會在服務中更新,而不是由於手錶而在範圍內。我應該以某種方式使用'$ loaded'嗎? – cassiusclay

+0

如果您總是希望同一個兩個用戶一起在同一個房間中結束,您還可以考慮將這個房間名稱放在這兩個用戶的uid上。這種方法的優點是不需要查詢來查找房間:相同的用戶會自動結束同一個房間。看到這個答案對這個概念的解釋:http://stackoverflow.com/questions/33540479/best-way-to-manage-chat-c​​hannels-in-firebase/33547123#33547123。 –

回答

1

Angular的$digest不知道您的Firebase查詢何時完成。在這種情況下,您可能會發現使用AngularFire更容易。

this.roomQuery = function(user1ID, user2ID) { 
    var query = roomsRef.orderByChild("user1").equalTo(user1ID); 
    return $firebaseObject(query).$loaded(); 
}; 

this.roomQuery("1", "2") 
    .then(function(data) { 
    // do your check here 
    }); 

$firebaseObject()發生在ref或查詢並知道何時調用消化代爲通知。

您可能希望查看using resolve in the routerroomQuery注入到路由器中,因爲它返回承諾.$loaded()

+0

謝謝,這非常有幫助。我在下面的答案中結束了實現。 – cassiusclay

0

David幫我找到了我需要的解決方案。對於有類似問題的人,這裏是我是如何實現它:

this.roomQuery = function(user1, user2) { 
    var query = roomsRef.orderByChild("user1").equalTo(user1ID) 

    return $firebaseArray(query).$loaded(); 
} 

我以前$firebaseArray,而不是對象,並在我的控制器:

$scope.getRoom = function() { 
    Messages.roomQuery($scope.user1.id, $scope.user2.$id).then(function(data) 
    { 
     $scope.data = data; 
     for(var i=0, len = data.length; i < len; i++){ 
     if (data[i].user2 == $scope.user2.$id) { 
      $scope.selectedRoom = data[i].$id; 
     } 
     } 
    } 
    ) 
    } 

道歉變量名是有點混亂。爲了這篇文章,我修改了它們。