1

ルートに基づいてコントローラーの特定の依存関係を解決できることはわかっています。ただし、常に解決したいサービスがあります。現在のユーザーです。

このサービスは基本的に、現在のユーザー (url は のようなもの/api/user/me) のサーバーへの get 要求を実行し、ユーザー ID、名前などを含むオブジェクトを返します。次のようにします。

CurrentUser.getCurrentUser().then(function(user) {
    // use user.id here
});

すでにロードされているデータのネストとコールバックの余分な不要なレイヤーを作成します。約束を待たずにどこでも使用できるように、ユーザーをグローバルにプリロードできる良い方法はありますか?

上記でリンクしたルート解決のラインに沿ったものですが、すべてのルートとおそらくサービスでも機能するはずです。

私は次のような結果を想像します:

// somewhere
AlwaysResolveThisBeforeDoingSomething(UserService.resolve);

// In my controller
.controller('CurrentUserCtrl', function ($scope, $http, CurrentUser) {
    // CurrentUser is an initialized user containing id, name etc.
4

2 に答える 2

0

1 つのオプションは、それを完了させることです。サービスにはユーザー プロパティがあり、必要に応じてそれにバインドできます。これは、サービスが情報を入力するまで、ユーザーが認証されていないようにすべてを扱うようなものです。

ページを生成するときに利用できるものがある場合は、それを HTML に含めたり、<SCRIPT>タグとして含めてみませんか? ASP.NET MVC では、次のことができます。

public ActionResult UserScript()
{
    var user = new { 
        id = 1,
        name = "jason"
    };
    string s = string.format("var my = {{ user: {0} }};", 
            JsonConvert.SerializeObject(user));
    return JavaScript(s);
}

また、配置する場所に応じて、ページ上のスクリプトと同じ順序でロードされますが、Angular ブートストラップまで値は重要ではないため、スクリプトの後に配置できます。ここでは単純に値を設定しましたが、サービスの一部にすることもできます。

<div ng-app ng-controller="MyCtrl">
    <script type="text/javascript">
        function MyCtrl($scope) {
            $scope.user = my.user;
        }
    </script>
    <h3>You are: {{user.name}}</h3>
</div>
<script type="text/javascript" src="@Url.Action("UserScript", "Test")"></script>
于 2013-10-27T16:04:22.840 に答える
0

あなたは $http を使用しているので、インターセプターを使用してこれを解決します。

angularjs ドキュメント セクション インターセプターhttp://docs.angularjs.org/api/ng.$httpから取得

グローバル エラー処理、認証、またはあらゆる種類の同期または非同期の要求の前処理または応答の後処理のために、要求がサーバーに渡される前に、および応答がサーバーに渡される前にそれらを傍受できることが望ましいです。これらのリクエストを開始したアプリケーション コード。インターセプターは promise API を活用して、同期および非同期の両方の前処理に対するこのニーズを満たします。

ここから始めることができます: http://plnkr.co/edit/td0jyy3j3rTAx1mZifjy?p=preview ローカル サーバーでこのコードをテストし、401 Unauthorized 応答を送信するようにサーバーを構成する必要があります。

于 2013-10-27T16:05:14.543 に答える