我在多人游戏中使用 AngularFire,它确实看起来 AngularFire 在第一次加载控制器后正在删除我的对象。
我正在使用 browserify 将我的 JS 文件连接在一起,因此我的所有模块看起来都像 CommonJS 模块。
我的控制器都是通过ngView
s 和定义的路由加载的。我试图保持对 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 新手都陷入了一个飞速发展的失败之球,但我会很感激任何人都可以提供的任何指针。