0

私はIonic/Firebaseの新機能ですが、データベースアクセスに関連するすべてが私の工場にあるようにコードをクリーンアップしようとしています。Ionic/Firebaseから常に最新のユーザーオブジェクトを取得するための工場を作成します

ユーザーを構造化する方法は、FacebookやGoogleを含む新しい認証のuidが、関連付けられたキーとともにuids配列に格納されるということです。ユーザーは最初にユーザー配列に格納されます(これは上記のキーがランダムに生成された場所です)。これにより、Authオブジェクトから現在のユーザーにアクセスできます。今、私は、現在のユーザーの詳細を取得する任意のコントローラから呼び出すことができます工場を作成しようとしています

{ 
    "uids" : { 
    "7d34fb85-813c-4586-857e-f062aed67f32" : { 
     "-KDQDk5vwJXmFngwI7iQ" : { 
     "registered" : true 
     } 
    } 
    }, 
    "users" : { 
    "-KDQDk5vwJXmFngwI7iQ" : { 
     "email" : "[email protected]", 
     "firstname" : "TestName", 
     "lastname" : "TestLastName", 
     "uid" : "7d34fb85-813c-4586-857e-f062aed67f32" 
    } 
    } 
} 

- など、

を姓を最初に名前をしかし、私はこれがあるとは思いません物事を働かせる正しい方法。理想的には、どのコントローラでもUsers.getCurrentUser.firstnameに電話したいと思っています。

ここに2つの工場があります。何が間違っているのですか?コードを再構築するにはどうしたらいいですか?

/** 
* Authentication service 
*/ 
    app.factory('Auth', ['rootRef', '$firebaseAuth', function (rootRef, $firebaseAuth) { 
     return $firebaseAuth(rootRef); 
    }]); 

/** 
* Anything related to the Users array 
*/ 
app.factory('Users', ['$firebaseArray','$firebaseObject', 'Auth', function ($firebaseArray, $firebaseObject, Auth) { 

    var ref = new Firebase("https://[myfirebaseurl].firebaseio.com"); 
    var users = $firebaseArray(ref.child('users')); 
    var uids = $firebaseArray(ref.child('uids')); 

    return { 
     all: function() { 
      return users; 
     }, 
     get: function (id) { 
      // Simple index lookup - I also want to be able to use this if a user lets say clicks a user profile in a list of profiles in the app to view a profile, but currently I have no user_id key in my database - do I need to set this up? 
      return users[id]; 
     }, 
     getCurrentUser: function() { 
      var uid = Auth.$getAuth().uid; 
      var key = new Firebase(uids + uid).child(); 
      var user = new Firebase(users + key).child(); 
      return $firebaseObject(user); 
     } 
    } 

}]) 

ご迷惑をおかけして申し訳ありません。

ありがとうございました。

+0

をあなたがの絵を含めましたあなたの質問のJSONツリー。 Firebaseデータベースの[Export]ボタンをクリックすると、実際のJSONをテキストとして置き換えてください。 JSONをテキストとして検索可能にすることで、実際のデータを使ってテストしたり、答えに使用したりすることができます。一般的には、これは良いことです。 –

+0

@FrankvanPuffelen変更が表示されます。 –

答えて

1

これは動作しません:

Users.getCurrentUser().firstname 

現代のウェブのほとんどのように、Firebaseでデータをロードするには、非同期的に起こります。データがロードされている間(Firebaseの場合、その後同期されます)、JavaScriptコードは引き続き実行されます。

これは、「ユーザーデータが読み込まれた/変更されたとき」の操作から「読み込み開始」を分割する必要があるためです。 AngularFireで

、あなたが解決する$loaded()約束を待つことによって、ユーザのためにロードされた初期データを取得することができます

var user = $firebaseObject(user); 
user.$loaded(function(user) { 
    console.log(user.firstname); 
}); 

をしかし、これは本当にアンチパターンでは、ユーザデータがありますのでその後変更すると、あなたの$loaded()コールバックは再び表示されません。

AngularFireで何が起こっているかを見るための最良の方法は、単にあなたのAngularJS内のオブジェクトを視覚化することであるビュー:

$scope.user = $firebaseObject(user); 

そして:

<pre> user | json </pre> 
+0

OK分かりました。しかし、コードのこれらの部分が実際にどこに行くのかを明確にすることはできますか? '$ firebaseObject'への引数であるユーザ変数は実際どこから来ますか?そして、この '$ loaded'コードは、現在のユーザを得るために各コントローラに入っていますか?この現在のユーザーを取得するために何かを再利用する方法はありませんか?サービス/工場?さらに、あなたは私のコードがUIDとキーからユーザーを三角形分割するかどうかを明確にすることができますか? –

関連する問題