web-dev-qa-db-ja.com

AngularJSコントローラーからExpressルートにリダイレクトするにはどうすればよいですか?

MEAN.ioのボイラープレートスタックを使用していて、それが非常に良い出発点であることがわかりましたが、さまざまなルーティングコマンドを混在させるのに問題があります。私のアプリには公開されているシンプルなサインインページがあり、他のすべてはその背後に隠されています。ユーザーが問題なく認証されているかどうかを確認できますが、サーバーからサインインページをロードするためにAngularを取得することはできません。HTMLページにすでにサインインボタンがあります。正しいルートを呼び出してもまったく問題ありません。コードから同じことを行うことはできません。

$ location.path( '/ signin');パスにハッシュが残っているため、コードはサーバーを呼び出しません

私のAngularコントローラー

angular.module('tms.tweets').controller('TweetsController', ['$scope', '$routeParams',
'$location', '$resource', 'Global', 'Tweets', function ($scope, $routeParams, $location,
$resource, Global, Tweets) {
$scope.global = Global;

$scope.find = function() {

    if(Global.authenticated){

        console.log(Global.authenticated);

        Tweets.query(function(tweets) {
            console.log("Tweets at Angular Controller: " + tweets.length);

            $scope.tweets = tweets;
        });
    }
    else{
        console.log("Unauthorized");

        $location.path('/signin');
    }

};
}]);
5
Mark

リダイレクトの問題に対する答えが見つかりました。$ location.pathを次のように交換しました。

$window.location.href = '/signin';
18
Mark

私の目的のために$window.location.href = '/newpath';コントローラーの内部からは機能していませんでした。

コントローラ内でリロードする必要がある場合は、次の関数を使用しています。

    $scope.changeRoute = function(url, forceReload) {
        $scope = $scope || angular.element(document).scope();
        if(forceReload || $scope.$$phase) { // that's right TWO dollar signs: $$phase
            window.location = url;
        } else {
            $location.path(url);
            $scope.$apply();
        }
    };

次に、次のように呼びます。

    $scope.changeRoute('#/newpath');

ただし、これを行うことは避け、アプリの構成フェーズに実行フェーズを追加することをお勧めします。アプリ構成に実行フェーズを追加する方法について詳しくは、こちらをご覧ください: http://www.angularjshub.com/examples/modules/configurationrunphases/

8
DrewT