私はangularjsで404ページをリダイレクトする代わりに404ページをレンダリングするための良いアプローチを探しています。私が見つけた多くの解決策は、すべて別のページにリダイレクトすることです。ユーザーがブラウザの戻るボタンをクリックすると、404ページへの別のリダイレクトが作成されるという問題が発生します。だから私は代わりに404ページをレンダリングするソリューションを探しています。
読んでくれてありがとう、皆さんに理解できるといいのですが。
otherwise
の使用法は、あなたが探しているものかもしれません。
angular.module('MyApp', [])
.config(function($routeProvider) {
$routeProvider.
when('/', {templateUrl:'/home.html'}).
// add as many as you want here...
otherwise({templateUrl:'/404.html'}); // Render 404 view
});
更新:OPの質問をもっと注意深く読んだ後(申し訳ありませんが、このあたりのかなり早い段階で)、私はと思います私には別の解決策があります(実際には2つ):
1)コンテンツを非表示にする$scope
のメインUIへのng-view
変数
これには、ビューにng-show
、パラメータにresolve
が必要です。次に、他のコントローラーに対して$emit
を実行して、「ねえ、この男は404をヒットし、表示しないでくださいあなたの見解」
$routeProvider.otherwise({
controller: 'masterController',
resolve: {
404: function(){
return true;
};
});
angular.module('MyApp', [])
.controller('masterController', function($scope, 404) {
$scope.isOn404 = 404
...
})
// In the view
<div ng-controller="masterController">
<div ng-hide="isOn404">
<!-- Actual content -->
</div>
<div ng-show="isOn404">
<!-- 404 Page -->
</div>
</div>
さて、これには、UIの残りの部分を管理するのに役立つマスターコントローラーが必要です。また、ng-view
を使用するだけでなく、ページの残りの部分を処理するためにコーディングを行う必要がある可能性があります(たとえば、現在のヘッダー、本文などを表示する一部のコントローラー)。
2)カスタムルーティングシステム
私は実際に特定のプロジェクトに対してこれを行いました。「BackURL」と「FordwardURL」を設定するサービスがあります。各$onRouteChange
は、どこに行き、どこから来たのかを保存します。ユーザーが404をヒットしようとしている場合でも、元の例でレンダリングできますが、ユーザーがヒットバックしたら、AngularJSでキャッチして、実際の「戻る」ページをレンダリングします。この場合、私は Lungo と呼ばれるモバイルデバイスでのルーティングに役立つライブラリと、私が働いている会社が使用するライブラリ LAB (Lungo = Angular Bridge)。
私はAngularJSを初めて使用するため、これは理想的なソリューションではないかもしれませんが、404ページ、またはログインページなどの同様の用途を表示するために機能します。
実例 を参照してください
すべてを同じマスターテンプレートにリダイレクトします。
$routeProvider
.when('/', {
controller: 'homeController',
templateUrl: 'partial.master.html'
})
.when('/cust/:custid', {
controller: 'custController',
templateUrl: 'partial.master.html'
})
master.htmlテンプレートはmasterControllerを参照し、サブページがあります。
<div ng-controller="masterController">
<h2><a href="#">{{title}} - Header</a></h2>
<hr>
<div ng-include="subPage"></div>
<hr>
<h3>{{title}} - Footer</h3>
</div>
masterControllerには、条件付きサブページロジックがあります。
controllers.custController = function($scope, $rootScope, $routeParams){
$rootScope.subpage = 'cust';
$scope.cust = getCustomer( $routeParams.custid );
};
controllers.masterController = function($scope, $rootScope) {
switch($rootScope.subpage) {
case 'home':
$scope.subPage = 'partial.home.html';
break;
case 'cust':
if($scope.cust) {
$scope.subPage = 'partial.cust.html';
} else {
$scope.subPage = 'partial.404notfound.html';
}
break;
以前にここで回答したように、ui-routerを使用することもできます: https://stackoverflow.com/a/23290818/2723184 。私見、あなたは素晴らしいライブラリを手に入れるだけでなく、より良い解決策を手に入れます。