ログインする前にすべてのユーザーが利用できるいくつかの基本的なルートを構成しました。
App.config(function ($routeProvider) {
$routeProvider.
when('/login', { templateUrl: 'views/login.html', controller: PageStartCtrl.Controller }).
otherwise({ redirectTo: '/login' });
});
したがって、ユーザーが実行できるのはログインすることだけです。ユーザーがログインした後、次のような追加のルートを登録したいと思います。
$http
.post('api/Users/Login', { User: userName, Password: userPassword })
.success(function (response : any) {
App.config(function ($routeProvider) {
$routeProvider
.when('/dashboard',
{ templateUrl: 'part/dashboard.html',
controller: DashboardCtrl.Controller });
});
ただし、$ routeProviderは/ loginルートについて何も知らない新しいインスタンスであるため、.configメソッドを1回だけ呼び出す必要があると思います。さらにデバッグすると、ビューの変更を解決するときに$ resourceProviderの最初のインスタンスが使用されることがわかりました。
Q:後でルートを登録する方法はありますか?
ルートとテンプレートを$ routeProviderに動的に追加する からの解決策は機能するかもしれませんが、かなり醜いです(グローバル変数nastyGlobalReferenceToRouteProvider
が含まれます)。
ルートはプロバイダーレベルで定義されるため、通常、新しいルートは構成ブロックでのみ定義できます。問題は、構成ブロックですべての重要なサービスがまだ定義されていないことです(特に$http
)。したがって、表面的には、wはルートを動的に定義できないように見えます。
さて、実際には、アプリケーションのライフサイクルの任意の時点でルートを追加/削除するのは非常に簡単であることがわかりました!$route
を見てください- ソースコード すべてのルート定義が$route.routes
ハッシュに保持されていることがわかります。これは、次のようにいつでも変更できます(簡略化された例)。
myApp.controller('MyCtrl', function($scope, $route) {
$scope.defineRoute = function() {
$route.routes['/dynamic'] = {templateUrl: 'dynamic.tpl.html'};
};
});
これが実際にこれを示すjsFiddleです: http://jsfiddle.net/4zwdf/6/
実際には、AngularJSが実行していることに近づきたい場合は、AngularJSが最後に/
を含むルートを正しく処理するようにリダイレクトルートも定義しているため、ルート定義ロジックはもう少し複雑になるはずです(事実上オプションにします)。
したがって、上記の手法は機能しますが、次の点に注意する必要があります。
otherwise
キーの下の同じハッシュに保存されるため、$route.routes
を使用してnull
ルートを定義することもできます。@ pkozlowski.opensourceによる回答はangularjs1.0.1でのみ機能することがわかりました。ただし、angular-route.jsが後のバージョンで独立したファイルになった後は、$ routeを直接設定しても機能しません。
コードを確認したところ、$ route.routesのキーは場所の照合に使用されなくなりましたが、代わりに$ route.route [key] .RegExpが使用されています。 Origin whenとpathRegExp関数をコピーすると、ルートが機能します。 jsfiddleを参照してください: http://jsfiddle.net/5FUQa/1/
function addRoute(path, route) {
//slightly modified 'when' function in angular-route.js
}
addRoute('/dynamic', {
templateUrl: 'dynamic.tpl.html'
});