Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在angularjs中查看Firebase查询_Javascript_Angularjs_Firebase_Angularfire - Fatal编程技术网

Javascript 在angularjs中查看Firebase查询

Javascript 在angularjs中查看Firebase查询,javascript,angularjs,firebase,angularfire,Javascript,Angularjs,Firebase,Angularfire,我正在用Firebase构建一个应用程序,其中一个方面是一对一聊天。我正在查询Firebase,以查看当前访问应用程序的用户和试图与其聊天的用户之间是否已经存在聊天室。如果它存在,我将尝试将该文件室作为所选文件室应用于范围。我正在使用“消息”服务来运行查询 this.roomQuery = function(user1ID, user2ID) { roomsRef.orderByChild("user1").equalTo(user1ID).on("child_added", functio

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

Angular的
$digest
不知道Firebase查询何时完成。在这种情况下,您可能会发现它更容易使用

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或查询,并知道何时代表您调用摘要


您可能希望签出以将
roomQuery
注入路由器,因为它返回一个带有
$loaded()

的承诺,David为我找到了所需的解决方案。对于任何有类似问题的人,以下是我是如何实现它的:

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;
        }
      }
    }
    )
  }
$scope.getRoom=function(){
Messages.roomQuery($scope.user1.id,$scope.user2.id)。然后(函数(数据)
{
$scope.data=数据;
对于(变量i=0,len=data.length;i

很抱歉变量名有点混乱。为了这篇文章,我修改了它们

我认为这与异步加载Firebase数据有关,但我不明白为什么Messages.selectedRoom会在服务中更新,而不是在监视范围内更新。我是否应该以某种方式使用<代码> $Load ?如果你总是希望同一个两个用户一起在同一个房间结束,你也可以考虑在这两个用户的UID上建立房间名称。这种方法的优点是,您不需要执行查询来查找文件室:相同的用户会自动进入相同的文件室。有关该概念的解释,请参见此答案:。谢谢,这非常有帮助。我最终实现了下面的答案。