この質問が古いことはわかっていますが、この問題に対するさまざまな解決策について多くの調査を行った後、より良い解決策を思いついたのではないかと思います。
更新 1:この回答を投稿してから、このコードをすべて、GitHub に投稿した単純なサービスに追加しました。リポジトリはここにあります。詳細については、お気軽にチェックしてください。
更新 2:この回答は、ルートのスタイルシートを取り込むための軽量ソリューションが必要な場合に最適です。アプリケーション全体でオンデマンド スタイルシートを管理するためのより完全なソリューションが必要な場合は、Door3 の AngularCSS プロジェクトをチェックアウトすることをお勧めします。よりきめ細かい機能を提供します。
将来誰かが興味を持った場合に備えて、私が思いついたのは次のとおりです。
<head>
1.要素のカスタム ディレクティブを作成します。
app.directive('head', ['$rootScope','$compile',
function($rootScope, $compile){
return {
restrict: 'E',
link: function(scope, elem){
var html = '<link rel="stylesheet" ng-repeat="(routeCtrl, cssUrl) in routeStyles" ng-href="{{cssUrl}}" />';
elem.append($compile(html)(scope));
scope.routeStyles = {};
$rootScope.$on('$routeChangeStart', function (e, next, current) {
if(current && current.$$route && current.$$route.css){
if(!angular.isArray(current.$$route.css)){
current.$$route.css = [current.$$route.css];
}
angular.forEach(current.$$route.css, function(sheet){
delete scope.routeStyles[sheet];
});
}
if(next && next.$$route && next.$$route.css){
if(!angular.isArray(next.$$route.css)){
next.$$route.css = [next.$$route.css];
}
angular.forEach(next.$$route.css, function(sheet){
scope.routeStyles[sheet] = sheet;
});
}
});
}
};
}
]);
このディレクティブは次のことを行います。
- およびを使用して、オブジェクト内のすべてのアイテムのタグ
$compile
のセットを作成する html 文字列を( を使用して) コンパイルします。<link />
scope.routeStyles
ng-repeat
ng-href
- コンパイルされた
<link />
要素のセットを<head>
タグに追加します。
- 次に、 を使用してイベント
$rootScope
をリッスンし'$routeChangeStart'
ます。イベントごと'$routeChangeStart'
に、「現在の」$$route
オブジェクト (ユーザーが去ろうとしているルート) を取得し、その部分固有の css ファイルを<head>
タグから削除します。また、「次の」$$route
オブジェクト (ユーザーが行こうとしているルート) を取得し、その部分固有の css ファイルを<head>
タグに追加します。
- また、
ng-repeat
コンパイルされた<link />
タグの部分は、オブジェクトに追加またはオブジェクトから削除される内容に基づいて、ページ固有のスタイルシートのすべての追加および削除を処理しscope.routeStyles
ます。
注: これには、ng-app
属性が<html>
要素上にある必要があり、上<body>
またはその内部にはありません<html>
。
2. を使用して、どのスタイルシートがどのルートに属しているかを指定します$routeProvider
。
app.config(['$routeProvider', function($routeProvider){
$routeProvider
.when('/some/route/1', {
templateUrl: 'partials/partial1.html',
controller: 'Partial1Ctrl',
css: 'css/partial1.css'
})
.when('/some/route/2', {
templateUrl: 'partials/partial2.html',
controller: 'Partial2Ctrl'
})
.when('/some/route/3', {
templateUrl: 'partials/partial3.html',
controller: 'Partial3Ctrl',
css: ['css/partial3_1.css','css/partial3_2.css']
})
}]);
css
この構成は、各ページのルートを設定するために使用されるオブジェクトにカスタム プロパティを追加します。'$routeChangeStart'
そのオブジェクトは、各イベントに として渡され.$$route
ます。したがって、'$routeChangeStart'
イベントをリッスンするときに、指定したプロパティを取得し、必要に応じてそれらのタグをcss
追加/削除できます。この例では省略されているため、ルートで<link />
のプロパティの指定は完全にオプションであることに注意してください。ルートにプロパティがない場合、ディレクティブはそのルートに対して何もしません。上記の例のように、ルートごとに複数のページ固有のスタイルシートを持つこともできることに注意してください。プロパティは、そのルートに必要なスタイルシートへの相対パスの配列です。css
'/some/route/2'
css
<head>
'/some/route/3'
css
3. 完了です
これら 2 つのことで、必要なすべてがセットアップされ、私の考えでは、可能な限りクリーンなコードでそれが実行されます。
私と同じようにこの問題に苦しんでいる可能性のある他の誰かを助けることを願っています.