0

Angular (ui-router) & Firebase アプリでアップロード ページを作成していますが、サインインしているユーザーのみがアップロード ページを利用できるようにしたいと考えています。アップロード URLexample.com/uploadにアクセスすると、 に送信されexample.com/postsます。

ユーザーがログアウトしているかどうかを確認し、ユーザーが実際にログアウトしているかどうかを確認するif ステートメントをupload.ctrl.jsコントローラーに記述して、これを達成しようとしました。ルート URL$locationへのパスを Angular のサービスに変更させました。/posts私のアプリのように:

if(Auth.logout) {
    $location.path('/posts');

    // Added the following line for feedback in console
    console.log('Auth.logout is true');
}

ただし、ユーザーがログインして に移動する/uploadと、upload.tpl.html/postsテンプレートは問題なく読み込まれますが、URL はではなく に切り替わります/upload。このアクションは、ユーザーがログアウトしている場合にのみ発生するはずですが、ユーザーがログインしている場合でも発生しています。

if ステートメントに追加した行に手がかりがありconsole.log('Auth.logout is true');ます。/upload理由はわかりませんが、ログイン中またはログアウト中にナビゲートしようとすると、2 回呼び出されます。それは常に正しいようです。そのため、 にアクセスしようとするとAuth.logoutURL は常に になります。/posts/upload

ここでこの問題を示すプランカーを作成しました

http://plnkr.co/edit/jx7xuyqxs3dPfQqTms6C?p=preview

別のウィンドウで起動して、URL の変更 (この場合は変更なし) を確認できます。

サインインするには、次を使用できます。

  1. 電子メール: a@a.com
  2. パスワード: 1111

この問題を解決する方法についてのアイデアはありますか? 前もって感謝します。

ノート:

Plunkr の実行中にhttp://run.plnkr.co/ZzrkWWeRl32wZsQ2/#/posts/uploadを新しいブラウザ タブにコピー アンド ペーストするように手動で URL を変更するにはURL)新しいタブで実行したら、手動で URL をhttp://run.plnkr.co/ZzrkWWeRl32wZsQ2/#/uploadに変更して(ログイン中またはログアウト中に)、URL がどのように元に戻るかを確認できます。http://run.plnkr.co/ZzrkWWeRl32wZsQ2/#/posts

アップデート

if文の条件をそのように変更することでこれを解決できました

if(!Auth.user) {
    $location.path('/posts');
}

存在し、true の場合Auth.user、ユーザーは認証済みです。


ファイル

upload.ctrl.js

app.controller('UploadCtrl', function ($scope, $stateParams, $location, Auth) {

        $scope.signedIn = Auth.signedIn;
        $scope.logout = Auth.logout;

        if(Auth.logout) {
            $location.path('/posts');
            console.log('Auth.logout is true');
        }
    });

auth.serv.js

app.factory('Auth', function ($firebaseSimpleLogin, FIREBASE_URL, $rootScope, $firebase) {
        var ref = new Firebase(FIREBASE_URL);
        var auth = $firebaseSimpleLogin(ref);

        var Auth = {
            login: function (user) {
                return auth.$login('password', user);
            },
            logout: function () {
                auth.$logout();
            },
            resolveUser: function() {
                return auth.$getCurrentUser();
            },
            signedIn: function() {
                return !!Auth.user.provider;
            },
            user: {}
        };

        $rootScope.$on('$firebaseSimpleLogin:login', function(e, user) {
            angular.copy(user, Auth.user);
            Auth.user.profile = $firebase(ref.child('profile').child(Auth.user.uid)).$asObject();

            console.log(Auth.user);
        });
        $rootScope.$on('$firebaseSimpleLogin:logout', function() {
            console.log('logged out');

            if(Auth.user && Auth.user.profile) {
                Auth.user.profile.$destroy();
            }
            angular.copy({}, Auth.user);
        });

        return Auth;
    });
4

1 に答える 1

1

更新された作業プランカーがあります

これはupload.ctrl.js前に

if(Auth.logout) {
   // this is reason why it goes to posts
   $location.path('/posts');
   console.log('Auth.logout is true');
}

ご覧のとおり、チェックはif(Auth.logout)です。logout は functionであるため、このステートメントは常に true を返します。つまり、私たちは常に$location.path('/posts');

これは更新されたバージョン()です。ログアウトの最後にある を参照してください。if(Auth.logout())

if(Auth.logout()) { // function call
   $location.path('/posts');
   console.log('Auth.logout is true');
}

ここで確認してください

于 2014-11-28T07:21:00.550 に答える