How to append a stylesheet to <head> in AngularJS $routeProvider?

后端 未结 4 1902
一生所求
一生所求 2020-12-15 01:59

I want to load a specific CSS file only when a user accesses the contact.html view on my AngularJS app/site. I found this answer which almost made sense to me H

相关标签:
4条回答
  • 2020-12-15 02:43

    I think the best/simplest answer is one I left here. Someone else asked the same question, so I came up with some simple code and a small github repo to handle this scenario.

    0 讨论(0)
  • 2020-12-15 02:45

    I made a service for it.

    Important part of the code :

    var head = angular.element(document.querySelector('head')); // TO make the code IE < 8 compatible, include jQuery in your page and replace "angular.element(document.querySelector('head'))" by "angular.element('head')"
    
    if(head.scope().injectedStylesheets === undefined)
    {
        head.scope().injectedStylesheets = [];
        head.append($compile("<link data-ng-repeat='stylesheet in injectedStylesheets' data-ng-href='{{stylesheet.href}}' rel='stylesheet' />")(scope)); // Found here : http://stackoverflow.com/a/11913182/1662766
    }
    
    head.scope().injectedStylesheets.push({href: "/url/to/style.css"});
    

    Full code in Github : https://github.com/Yappli/angular-css-injector)

    0 讨论(0)
  • 2020-12-15 02:50

    UPDATED: Here is the solution to inject(load) a specific CSS using the $routeProvider.

    The solution described below is an alternative to apply different classes and page title based on the route which could be used in other situations.

    For each route I've created a new key called 'bodyClass' and 'title' (but you could called anything you like it) and it looks like this:

    'use strict';
    var myApp = angular.module('myApp', 'ngResource'])
    .config(function ($routeProvider) {
    
    myApp.siteName = 'My Cool App';
    
    $routeProvider
        .when('/home', {
         title:'Home - ' + myApp.siteName,
         bodyClass: 'home',
         templateUrl: 'views/home.html',
         controler: 'bmsHomeCtrl'
        })
        .when('/contact', {
          title:'Contact - ' + myApp.siteName,
          bodyClass: 'contact',
          templateUrl: 'views/contact.html',
          controler: 'bmsContactCtrl'
        })
        .otherwise({
          redirectTo: '/home'
        });
    });
    

    Then for each $routeChangeSuccess event I change the <title> of the page and also the class of the <body>.

    myApp.run(['$location', '$rootScope', function($location, $rootScope) {
        $rootScope.$on('$routeChangeSuccess', function (event, current, previous) {
    
          if (current.$$route) {
    
            $rootScope.title = current.$$route.title;
    
            $rootScope.bodyClass = current.$$route.bodyClass;
          }
        });
    }]);
    

    You put the code above on the same main app.js (for example) file.

    On my index.html page, which renders the views, I have the following codes to pick up the title and class:

    <title>{{ title }}</title>
    
    <body class="{{ bodyClass }}">
    

    So if i visit the home page of my application the title tag will be

    <tittle> Home - My Cool App</tittle>
    

    and the body tag will be

    <body class="home">
    

    It's working like a charm.

    I know this solution doesn't load a CSS file, but you could put those styles inside a '.contact' class that is applied only when you hit a specific route.

    Not sure if solves your problem but I hope that helps or at least point you on the right direction.

    0 讨论(0)
  • 2020-12-15 02:51

    For a full solution I suggest using AngularCSS.

    As you already know, in Angular we can include templates (structure) and controllers (behavior) in pages and components. AngularCSS enables the last missing piece: attaching stylesheets (presentation).

    Routes example:

    $routeProvider
    .when('/page1', {
      templateUrl: 'page1/page1.html',
      controller: 'page1Ctrl',
      /* Now you can bind css to routes */
      css: 'page1/page1.css'
    })
    .when('/page2', {
      templateUrl: 'page2/page2.html',
      controller: 'page2Ctrl',
      /* You can also enable features like bust cache, persist and preload */
      css: {
        href: 'page2/page2.css',
        bustCache: true
      }
    })
    .when('/page3', {
      templateUrl: 'page3/page3.html',
      controller: 'page3Ctrl',
      /* This is how you can include multiple stylesheets */
      css: ['page3/page3.css','page3/page3-2.css']
    })
    .when('/page4', {
      templateUrl: 'page4/page4.html',
      controller: 'page4Ctrl',
      css: [
        {
          href: 'page4/page4.css',
          persist: true
        }, {
          href: 'page4/page4.mobile.css',
          /* Media Query support via window.matchMedia API
           * This will only add the stylesheet if the breakpoint matches */
          media: 'screen and (max-width : 768px)'
        }, {
          href: 'page4/page4.print.css',
          media: 'print'
        }
      ]
    });
    

    Directive example:

    myApp.directive('myDirective', function () {
      return {
        restrict: 'E',
        templateUrl: 'my-directive/my-directive.html',
        css: 'my-directive/my-directive.css'
      }
    });
    

    You can read more about AngularCSS here:

    http://door3.com/insights/introducing-angularcss-css-demand-angularjs

    0 讨论(0)
提交回复
热议问题