1

特定の機能コンテンツを表示するには、AngularJS アプリでユーザーのステータスを確認する必要があります。私の見解では、次の HTML があります。

<span ng-show="authService.isSuperUser()">You are a Super User</span>

ユーザーが「スーパーユーザー」ステータスを持っているかどうかを判断し、スパンを表示するために、サービスに次の JavaScript コードがあります

this.isSuperUser = function () {

    if (loggedInUser !== null) { // loggedInUser is true in most cases
        return getSuperUser();
    } else {
        return false;
    }

};

var getSuperUser = function(){
    return $http({method: 'GET', url: '/url/to/rest/service/for/superuser' }).then(function (response) {
        return response; // this is either true or false and is working

    }, function () {
        console.log('Yikes! An Error!');
        return false;
    });
};

getSuperUser関数は正しい結果 (true または false) を提供するようになりましたが、ブラウザーでこれを実行すると、何千もの Infinite $digest Loop エラーが生成されます。私は明らかにこれを間違った方法で行っています。ソリューションを最適に実装してエラーの発生を止める方法についてのアイデアはありますか? HTML ビューは、ユーザーが myapp.com/#/youraccount などの特定の URL にアクセスしたときに読み込まれますがng-show="authService.isSuperUser()"、アプリでは読み込まれません。

4

1 に答える 1

1

このコードを試してください:

.factory('authService', function($http) {
    return {
         isSuperUser: function () {
             return $http.get(......);
         }
    };

})

.controller('MyCtrl', function($scope, authService) {
    $scope.isSuperUser = authService.isSuperUser();
})

<span ng-show="isSuperUser">you are a super user</span>

コントローラーが実行されると、ajax 呼び出しを開始し、すぐに promise を返すサービスを呼び出します。

その promise を isSuperUser という名前の $scope 変数にコピーします。

あなたの見解はその約束に拘束されます。解決されると、true または false になり、それに応じて ng-show が機能します。それまでは false と見なされます (私は :P だと思います)

于 2013-11-04T23:18:53.297 に答える