0

我在多人游戏中使用 AngularFire,它确实看起来 AngularFire 在第一次加载控制器后正在删除我的对象。

我正在使用 browserify 将我的 JS 文件连接在一起,因此我的所有模块看起来都像 CommonJS 模块。

我的控制器都是通过ngViews 和定义的路由加载的。我试图保持对 Firebase 中用户对象的了解仅限于用户服务;因此,用户对象的所有 AngularFire 调用都存在于服务中。

这是我的 HomeController:

module.exports = function(ngModule) {
  ngModule.controller('HomeController',
      function($scope, user) {
    if (!$scope.user) {
      return;
    }

    user.getInvitations($scope);
    user.getGames($scope);
  });
};

我正在使用我定义的身份验证服务中的 AngularFire 身份验证。当用户对象进来时,它被存储在 $rootScope 中。这是我的身份验证服务的片段:

ngModule.run(function(angularFireAuth, warbase, $rootScope) {
  // Here's where Firebase does all the work.
  angularFireAuth.initialize(warbase, {
    scope: $rootScope,
    name: 'user',
    path: '/login'
  });
});

我的用户服务使用gotUser当用户出现在 $rootScope 上时解决的承诺。这是我的用户服务的片段:

$rootScope.$watch('user', function() {
  if (!$rootScope.user) {
    return;
  }
  userRef = warUsers.child(getPlayerId());
  userInvitationsRef = userRef.child('invitations');
  userGamesRef = userRef.child('games');
  gotUser.resolve();
});

// ...

getInvitations: function(scope) {
  scope.invitations = [];
  gotUser.promise.then(function() {
    angularFire(userInvitationsRef, scope, 'invitations');
  });
},

getGames: function(scope) {
  scope.games = [];
  gotUser.promise.then(function() {
    angularFire(userGamesRef, scope, 'games');
  });
}

当我的 HomeController 由没有游戏且没有邀请的用户加载时,一切都按预期工作。用户创建一个游戏并显示在主屏幕上。

如果我然后重新加载页面,则用户的游戏对象(来自 path /users/:userId/games/)将被清除。目前在我的应用程序中没有删除这些值的代码。

我认为可能有对 AngularFire 的引用并同步我在用户服务中设置的空白值,所以我删除了该scope.games = [];行。如果我没有在我的服务范围内设置初始值,我会在控制台中收到此错误:Uncaught Error: Firebase.set failed: First argument contains undefined.

我猜这与我对控制器生命周期的不熟悉有关ngView,我滥用服务来干掉我的 Firebase/AngularFire 引用,以及一般的 AngularJS 新手都陷入了一个飞速发展的失败之球,但我会很感激任何人都可以提供的任何指针。

4

0 回答 0