【发布时间】:2015-12-06 22:11:21
【问题描述】:
我正在使用 Firebase 在 Angular 中构建一个应用程序,其中一个方面是一对一聊天。我正在查询 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 有时不会更新。知道这里发生了什么吗?我很困惑。如果它正确地记录到控制台,它不应该在范围内更新吗?
【问题讨论】:
-
我认为这与异步加载的 Firebase 数据有关,但我不明白为什么 Messages.selectedRoom 会在服务中更新,而不是由于手表而在范围内更新。我应该以某种方式使用
$loaded吗? -
如果您总是希望相同的两个用户最终一起进入同一个房间,您还可以考虑将房间名称基于这两个用户的 uid。这种方法的优点是您无需进行查询即可查找房间:相同的用户最终会自动进入相同的房间。有关该概念的解释,请参阅此答案:stackoverflow.com/questions/33540479/…。
标签: javascript angularjs firebase angularfire