【问题标题】:Watching Firebase query in angularjs在 angularjs 中观看 Firebase 查询
【发布时间】: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


【解决方案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() 的承诺。

【讨论】:

  • 谢谢,这很有帮助。我最终按照下面的答案实现了它。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2015-04-13
    • 2015-07-02
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多