0

私のアプリケーションでは、各ユーザに特定のプロファイルがあります。currentUserという名前のこのプロファイルを保持するサービスを作成しました。ユーザがログインした後にユーザプロファイルを取得する

このプロファイルのプロパティを使用して、サイトのヘッダーをレンダリングし、さらにAPI呼び出しを行います。

問題は、このcurrentProfileサービスをいつ入力する必要がありますか?

は、いくつかのオプションがあります:

1 - ログイン約束が解決された後:

authService.login(username, pass) 
    .then(function(response) { 
     userService.getProfile() 
      .then(function(profile){ 
       currentUser.setProfile(profile); 
       $state.go('dashboard'); 
      }); 
    }); 

このアプローチの主な問題は、ユーザーがこのURL /main/listであり、ページをリフレッシュした場合、 currentUserが空になります。

2から$locationChangeStartcurrentUserのイベントハンドラがまだ満たされていないhereなどのUIルータdeferIntercepturlRouter.sync()$urlRouter.listen()を使用して、このアプローチの主な問題は、私のヘッダディレクティブとコントローラが前に(または中)に実行されることをです。

私は砂漠化の効果をどのように達成できますか?どんなアイデアも気付かれる!

編集:私はのlocalStorageやクッキーや....

+0

のlocalStorageやクッキーにログイン移入プロファイルの後、戻ってリフレッシュ時にそれを取得します。ログアウト時にクリアしてください –

+0

@SaneeshB私はこれらのストレージを使いたくありません。 – Rachmaninoff

答えて

1

uiで、ルータに依存したくない、それはアプリケーションを続行する前にデータがロードされることを保証resolveプロパティを持っています。

$stateProvider 
 
     .state('main.list', { 
 
      url: "/main/list", 
 
      templateUrl: "views/custom/index.html", 
 
      controller:MainController, 
 
      resolve: { 
 
       loginUser : function($q){ 
 
        //load data or whatever 
 
        return loadData(); 
 
       } 
 
      } 
 
     })

+0

あなたが言うことは、それぞれのアプリケーション状態に余分な解決プロパティを追加しなければならないということです。 'currentUser'の性質はresolveプロパティとは異なります。それは私のアプリのどこででも使用できるグローバルなサービスであり、各ユースケースではそれを満たす必要があります。 – Rachmaninoff

+1

解決する必要があるのは、現在のユーザーを設定する必要がある場合のみです。あなたはそれをすべての州に追加する必要はありません抽象的な状態を持っているし、それにそれを追加するので、その下のすべての子は同じ解決を継承します。グローバルサービスであるcurrentUserもこれとは関係ありません。ユーザーが特定のURLやその他の条件に当たったときにサービスを埋めたい場合、このサービスはアプリ内の他の場所からも埋め込むことができます。 –

+0

おかげで、あなたの解決策はうまく動いているようですが、 '$ q'の使い方は?それは私にとって冗長なようです。 – Rachmaninoff

関連する問題