首页 文章

在angularjs中观看Firebase查询

提问于
浏览
2

我正在使用Firebase在Angular中构建应用程序,其中一个方面是一对一聊天 . 我正在查询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有时不会更新 . 知道这里发生了什么吗?我是否正确登录到控制台,是否应该在范围内更新?

2 回答

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

    您可能需要检查using resolve in the router以将 roomQuery 注入路由器,因为它返回 .$loaded() 的承诺 .

  • 0

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

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

    我在我的控制器中使用 $firebaseArray 而不是Object:

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

    为变量名称道歉有点令人困惑 . 为了这篇文章我改变了它们 .

相关问题