나는이 질문이 오래되었다는 것을 알고 있지만이 문제에 대한 다양한 솔루션에 대한 많은 연구를 한 후에 더 나은 솔루션을 생각해 낼 수 있다고 생각합니다.
업데이트 1 : 이 답변을 게시 한 후이 코드를 모두 GitHub에 게시 한 간단한 서비스에 추가했습니다. 레포는 여기 에 있습니다 . 자세한 내용은 언제든지 확인하십시오.
업데이트 2 : 이 답변은 경로의 스타일 시트를 가져 오는 경량 솔루션 인 경우 유용합니다. 응용 프로그램 전체에서 주문형 스타일 시트를 관리하기위한보다 완벽한 솔루션을 원한다면 Door3의 AngularCSS 프로젝트를 확인하십시오 . 훨씬 더 세분화 된 기능을 제공합니다.
미래의 누군가가 관심이 있다면, 내가 생각해 낸 것은 다음과 같습니다.
1. <head>
요소에 대한 사용자 지정 지시문을 만듭니다 .
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
객체 (사용자가 떠나려는 경로)를 잡고 <head>
태그 에서 부분 별 CSS 파일을 제거합니다 . 또한 "다음" $$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. 당신은
그 두 가지가 필요한 모든 것을 설정하고 제 생각에는 가능한 가장 깨끗한 코드로 설정합니다.
이 문제로 어려움을 겪고있는 다른 사람에게 도움이되기를 바랍니다.
<link>
태그를 사용했습니다 ( "캐시 사용 안함"을 사용하여 "첫 번째로드"조건을 시뮬레이션). 서버의 HTML 부분에 태그 를 미리 삽입하면 이 문제를 피할 수 있다고 생각합니다 .<style>