0

ui-router現在のユーザー ステータスを表示するビューの 1 つを持つ状態を作成しました。次のコードは、現在のユーザー ステータスを取得します。

var sydney = sydney || {};
sydney.checkAuth = function() {
    gapi.auth.authorize({
        client_id : sydney.CLIENT_ID,
        scope : sydney.SCOPES,
        immediate : true
    }, sydney.handleAuthResult);
}

sydney.handleAuthResult = function(authResult) {
    if (authResult) {
        // The user has authorized access
        console.log("User is signed in");
    } else {
        // User has not Authenticated and Authorized
        console.log("User is not signed in");
    }
}

は次のstateように定義されます。

$stateProvider
.state('route1', {
    url: "/route1",
    views : {
        "headerView" : {
            templateUrl : 'partials/header.html',
            controller: 'LoginController'
        },
        "navigationView" : {
            templateUrl : 'partials/navigation.html',
            controller: 'NavigationController'
        },
        "contentView": {
            templateUrl : 'partials/content1.html'
        }
    }
})  

LoginController:_

function LoginController($scope, $state) {
    $scope.checkUserStatus = function() {
        sydney.checkAuth();
    }
}

これらのパーツをすべて接着する必要があるため、headerViewが表示されたときに、ユーザーの状態 (ログインしているかどうか) を表示できます。

LoginController私が最初にしたことは、ステータスを保持するために変数を作成することです

$scope.userStatus = sydney.checkAuth();

問題は、 が作成された時点でロードされていないsydney.checkAuthに依存していることです。だから私は完全に理にかなっています。Google APIs Client Library for JavaScriptLoginControllergapi is not defined

別の解決策は、(コールバックで) がロードされた$scope.userStatus後に初期化することです。gapiしかし、どのようにコントローラに更新するように指示します$scope.userStatusか?

4

1 に答える 1

0

この種の問題にはいくつかの異なるアプローチがあります。

同様の状況で、依存関係からイベントを送信するために$rootScope使用して注入することに成功しました。つまり、これは、コントローラー、サービスなどで必要に応じて取得できます。$broadcastgapiSetup

具体的には、使用$broadcastするとコンポーネントが分離され、ヘッダーだけでなく他の場所を更新する必要があるかのように、そのイベントを複数の場所で使用することもできます。

于 2013-07-02T22:26:44.520 に答える