在 angularjs 中观看 Firebase 查询

Watching Firebase query in angularjs

我正在 Angular 中使用 Firebase 构建一个应用程序,其中一个方面是一对一聊天。我正在查询 Firebase 以查看当前访问应用程序的用户和他们试图与之聊天的用户之间是否已经存在聊天室。如果它存在,我将尝试将该房间作为所选房间应用于范围。我正在使用 "Messages" 服务来 运行 查询。

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 有时不会更新。知道这里发生了什么吗?我很困惑。如果它正确地登录到控制台,它不应该在范围内更新吗?

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() 接收引用或查询并知道何时代表您调用摘要。

您可能想要查看 using resolve in the router 以将 roomQuery 注入路由器,因为它 returns 与 .$loaded() 的承诺。

大卫帮我找到了我需要的解决方案。对于有类似问题的任何人,以下是我的实现方式:

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;
        }
      }
    }
    )
  }

抱歉变量名有点混乱。为了这个 post,我改变了它们。