web-dev-qa-db-ja.com

templateUrlなしでルーティングする方法は?

OK。ユーザーをログアウトするためのURL設定があります。サーバーには、htmlはありません。サーバー上のセッションは単純に破棄され、ユーザーはアドレスにリダイレクトされます。

これはプレーンhtmlで正常に動作しますが、Angularで問題が発生します。$routeProvider.when('/foo', {templateUrl: '/foo.html', controller: 'Ctrl'})を使用してすべてのメインルートをルーティングしており、通常のテンプレートルートでは正常に動作します。ただし、テンプレートがない場合は機能しません。

だから、どのようにルートをサポートしますか/logout上記と同じ方法で、htmlテンプレートがない場合

30
Lee Olayvar

回避策は、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」に変更しました。ビューのスコープを設定する代わりに、サービスに似ており、最終的にリダイレクトされます。

59
Lukas

私はすでに受け入れられている答えとそのコメントに記載されているgithubの問題に基づいてソリューションを書いています。


私が使用しているアプローチは、$routeProviderresolveパラメーターです。私の場合、ユーザーが/ 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('/');
    }
});

よく働く!

9
Atais