マルチプレイヤー ゲームで AngularFire を使用していますが、コントローラーの最初のロード後に AngularFire がオブジェクトを削除しているように見えます。
すべてのモジュールが CommonJS モジュールのように見えるように、browserify を使用して JS ファイルを連結しています。
私のコントローラはすべて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 に存在するときに解決される promise を使用します。これが私のユーザーサービスのスニペットです:
$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 参照を DRY するためにサービスを誤って使用したこと、および一般的な AngularJS の初心者がすべて失敗のギャロッピング ボールに巻き込まれたことと関係があると推測していますが、感謝します誰もが提供できるポインタ。