OK。ユーザーをログアウトするためのURL設定があります。サーバーには、htmlはありません。サーバー上のセッションは単純に破棄され、ユーザーはアドレスにリダイレクトされます。
これはプレーンhtmlで正常に動作しますが、Angularで問題が発生します。$routeProvider.when('/foo', {templateUrl: '/foo.html', controller: 'Ctrl'})
を使用してすべてのメインルートをルーティングしており、通常のテンプレートルートでは正常に動作します。ただし、テンプレートがない場合は機能しません。
だから、どのようにルートをサポートしますか/logout
上記と同じ方法で、htmlテンプレートがない場合
回避策は、template
の代わりにtemplateUrl
を使用することです。 Angular docs から:
template – {string =} – ngViewまたはngIncludeディレクティブで使用される文字列としてのHTMLテンプレート。このプロパティは、templateUrlよりも優先されます。
これは次のように使用できます。
_$routeProvider.when("/foo", {template: " ", controller: "Ctrl"});
_
注:Angularはコントローラーを起動する前にif (template)
チェックを使用し、空の文字列を使用するため、空の文字列_" "
_の代わりに_""
_を使用する必要がありますfalseと評価されます。
-編集-
より良い方法は、resolve
マップを使用することです。 Angular Docs を参照してください:
resolve-{Object。=}-コントローラーに注入する必要がある依存関係のオプションのマップ。
これは次のように使用できます。
_$routeProvider.when('/foo', {resolve: {redirect: 'RedirectService'}});
_
注:質問で説明しているものは、実際にはAngularの意味での「コントローラー」ではないため、「Ctrl」から「RedirectService」に変更しました。ビューのスコープを設定する代わりに、サービスに似ており、最終的にリダイレクトされます。
私はすでに受け入れられている答えとそのコメントに記載されているgithubの問題に基づいてソリューションを書いています。
私が使用しているアプローチは、$routeProvider
のresolve
パラメーターです。私の場合、ユーザーが/ logoutに移動するときに、アプリケーションでlogoutのNiceソリューションを作成しようとしました。
$routeProvider
のサンプルコード:
app.config(['$routeProvider', function ($routeProvider) {
$routeProvider.
...
when('/logout', {
resolve: {
logout: ['logoutService', function (logoutService) {
logoutService();
}]
},
}).
...
}]);
解決部分では、名前でサービス(工場)を指定し、後でhave to呼び出します。それでもそれは周りの最も良い解決策です。
例を完成させるために、私のlogoutService
を提示します:
angular.module('xxx').factory('logoutService', function ($location, Auth) {
return function () {
Auth.setUser(undefined);
$location.path('/');
}
});
よく働く!