2013-10-11 5 views
35

Webアプリケーションの一部をAngularで記述しました。すべてのルートが確実にカバーされるように、$routeProviderredirectToプロパティを追加して、無効なルートがAngularを使用しないWebアプリケーションのルートに返されるようにしました。

は、私が試した:URLの角度制御された部分で、このルートだけ

$routeProvider.otherwise({ 
    redirectTo: '/' 
}); 

しかし、明らかに、ユーザーがhttp://app.com/angular-part-of-web-app#のようなURLにリダイレクトされますので、代わりに私はそれらをたいhttp://app.com、の行く。

Iは、部分ブランクが「404」ページとして機能するように、その後だけ$windowオブジェクトを使用して、コントローラは、所望のページにリダイレクトすることによってこの問題を回避働いてきた:

routes.js

// Redirect to site list. 
$routeProvider.when('/404', { 
    templateUrl: '/partials/404.html', 
    controller: 'RedirectCtrl' 
}); 

// Redirect to the 404 page. 
$routeProvider.otherwise({ 
    redirectTo: '/404' 
}); 

controllers.js

// Controller to redirect users to root page of site. 
.controller('RedirectCtrl', ['$scope', '$window', function ($scope, $window) { 

    $window.location.href = '/'; 
}]); 

しかし、これは 'あまりにもハッキーな、より良い方法でなければならない'という警告鐘を放つものです。 Angularでこれを行うより良い方法はありますか?

編集:Angular routes - redirecting to an external site?は、同じ質問に対する回答を得ていません。あまりにも速く動いているAngular世界では、以前の答えはもはや事実ではないかもしれないので、私は自分の質問を複写としてマークするのではなく、開いたままにします。あなたはこのような何か行うことができます

+2

おそらくサーバー側で処理します。 – tymeJV

+2

私もこれを解決しようとしています。私は、アプリケーションをAngularに切り替えて、サーバから提供されている部分をいくつか持っています。角度部分と非角度部分を接続する方法を見つける必要があります – Michael

答えて

41

上記の/ 404を使用したソリューションは、私にとっては機能しません。 これはうまくいくようです。

.otherwise({ 
    controller : function(){ 
     window.location.replace('/'); 
    }, 
    template : "<div></div>" 
}); 

PSです。私は角度を使用しています1.2.10

+4

私はAngular 1.2も使用していますが、受け入れられた答えはうまくいかなかったが、これがしました。テンプレートも必要でした。 – Chadwick

+0

ドメインのルートではなく別の場所に移動する必要がある場合、 'window.location'メソッドを使用するため、ハッシュ'# '、アンカー名を'/'および/または' a'アンカー名にする必要があります。 –

19

$routeProvider.when('/404', { 
    controller: ['$location', function($location){ 
     $location.replace('/'); 
    }] 
}).otherwise({ 
    redirectTo: '/404' 
}); 

をそれだけで、それはより少ないコードを使用して、本質的には同じものです。

+1

コントローラがそのようにインラインで宣言できるかどうかわかりませんでした。それは非常にクールです、ありがとう! – surfitscrollit

18

受け入れられた答えが書かれたAngular JSのバージョンはわかりませんが、 'redirectTo'プロパティは関数を取ります。だから、このような簡単な操作をしないでください。

$routeProvider.otherwise({ 
    redirectTo: function() { 
     window.location = "/404.html"; 
    } 
}); 

明らかに404.htmlを作成する必要があります。または、あなたの404ページがどこにあっても。

+1

どのようにして現在のパスをredirectTo関数に渡しますか? –

+0

JavaScriptで現在のURLを 'document.URL'で取得することができます – stack247

+0

document.location.pathnameはおそらくパスを取得するための最良のオプションです –

5

マークされた回答を含む回答はどれも私にとっては役に立たなかった。私は私のソリューションがあなたの問題を解決すると信じています。私はユースケースを将来の読者の参考にも分かち合いたいと思います。ルートコントローラメソッドを使用して

問題:コントローラは、すでにルーティングをロードされている私のための履歴API状態にアクセスした (私は、HTML5モードを使用し、これは非HTML5モードに影響を与えるかどうかわかりません)。

結果として、私は window.locationを使用して正しいページに人を転送することができます。replace( '/'); ユーザーがブラウザで[戻る]をクリックすると、無効な状態になります。

シナリオ:私はマルチページモデルを実装しており、管理ページモジュールは私のホームページ(非管理者)モジュールとは別に持っています。私は、私の管理コントローラのどこかに$ location.path( '/')を持っていますが、ホームページは管理ページモジュールにパッケージ化されていないので、 '/'ルートを検出すると強制的に全ページをリロードします。

解決策: ngRouteがすべての状態情報にアクセスする前に、$ routeChangeStartで傍受する必要があります。このように私たちも、$ルート

angular.module('app',['ngRoute']) 
.config(['$routeProvider', function($routeProvider) { 
    $routeProvider 
    .when('/admin/default', {template: somePageTemplate}) 
    /* 
    * More admin-related routes here... 
    */ 
    .when('/',{redirectTo:'/homepage'}) // <-- We want to intercept this 
    .otherwise({redirectTo: '/admin/default'}); 
}]) 
.controller('MainCtrl',[ // <- Use this controller outside of the ng-view! 
    '$rootScope','$window', 
    function($rootScope,$window){ 
    $rootScope.$on("$routeChangeStart", function (event, next, current) { 
     // next <- might not be set when first load 
     // next.$$route <- might not be set when routed through 'otherwise' 
     // You can use regex to match if you have more complexed path... 
     if (next && next.$$route && next.$$route.originalPath === '/') { 
     // Stops the ngRoute to proceed 
     event.preventDefault(); 
     // We have to do it async so that the route callback 
     // can be cleanly completed first, so $timeout works too 
     $rootScope.$evalAsync(function() { 
      // next.$$route.redirectTo would equal be '/homepage' 
      $window.location.href = next.$$route.redirectTo; 
     }); 
     } 
    }); 
    } 
]); 

私は自分自身、このコードを使用すると任意のフィードバックを提供してくださいにredirectToのPARAMにURLを渡すことによって、外部のhrefを指定することができます。 乾杯

参考: https://github.com/angular/angular.js/issues/9607

1

こんにちはそれは単にwindow.location.assign(「/ログイン」)を使用して、ちょうどこの答えを探しいくつかのいずれかのために、2年間をされているにもかかわらず。それは私の仕事です。

+0

これはうまくいくと思います.-私は 'location.assign'と' location.replace'の違いを調べて誰か興味があれば良い答えを見つけました:http://stackoverflow.com/questions/4505798/window-location-assign-and-window-location-replaceの差異 – surfitscrollit

関連する問題