了解Angular服务中firebase的用法

时间:2014-07-28 08:39:49

标签: javascript angularjs firebase

以下是official firebase documentation

中的示例代码
var app = angular.module("myChatRoom", []);
app.factory("ChatService", function() {
  var ref = new Firebase("https://<your-firebase>.firebaseio.com/chat");
  return {
    getMessages: function() {
      var messages = [];
      ref.on("child_added", function(snapshot) {
        messages.push(snapshot.val());
      });
      return messages;
    },
    addMessage: function(message) {
      ref.push(message);
    }
  }
});
app.controller("ChatCtrl", ["$scope", "ChatService",
  function($scope, service) {
    $scope.user = "Guest " + Math.round(Math.random()*101);
    $scope.messages = service.getMessages();
    $scope.addMessage = function() {
      service.addMessage({from: $scope.user, content: $scope.message});
      $scope.message = "";
    };
  }
]);

我想了解这里发生了什么,因为我无法确定为什么这实际上有效。

当控制器触发时,

getMessages()仅被调用一次。然而,即使之后从未调用getMessages(),事件绑定也会触发。同样,$ scope属性也会更新。

为什么?另外,这是使用Firebase和Angular服务/工厂的推荐方法吗?

1 个答案:

答案 0 :(得分:2)

getMessages中,您有以下电话:

ref.on("child_added", function(snapshot) {
  ...

这会注册一个回调,只要将孩子添加到您的Firebase聊天中,就会调用该回调。

即使getMessages退出,该回调仍将保持注册状态。这就是为什么你只需要拨打getMessages一次。该名称有点违反直觉,我可能会称之为registerMessageHandlerregisterForNewMessages

无论哪种方式:将为每个添加的子项触发回调,直到您将其关闭(通过调用ref.off("child_added")或直到页面重新加载为止。这称为异步操作:无论原始流在何处,都会发生回调。回调流程和主要代码是异步。在这种意义上,它类似于常规JavaScript setInterval(在主代码继续时也会异步触发)或常见的XMLHttpRequest(通常在其调用方法返回后触发)。