在AngularJS中的index.html上加载动态CSS

时间:2015-08-29 22:21:00

标签: javascript html angularjs

我有一个AngularJS SPA。在应用程序的初始化过程中,我从服务器获取了一个主题,其中包含几个CSS URL。

我想使用这些,如果是404,则回退到默认值。

我认为我可以设置一个简单的指令来完成此任务,但我无法让它正常工作。

.directive('errorHref', function() {
    return {
        link: function(scope, element, attrs) {
            element.bind('error', function() {
                attrs.$set('ng-href', attrs.errorHref);
            });
        }
    }
});

HTML:注意,控制器正在工作;但是,headController中的_init事件在其他所有事件之前都会触发。

<html ng-app="timeclock">
    <head ng-controller="headController">
        <link ng-href="{{urlToAppCSS}}" error-href="content/css/app.css" rel="stylesheet">

这是正确的方法还是有更好的方法?一切似乎应该正常运行(并且在我的应用程序的其他部分几乎完全相同的情况下工作),但element.bind('error'...函数实际上从未触发过。

2 个答案:

答案 0 :(得分:1)

我不确定<link>元素是否会触发错误事件。所以我建议使用指令和<style>元素。请注意,有很多方法可以做这样的事情,这只是一个过于简化的例子:

.directive('customStyle', function($http) {
    return {
        restrict: 'E',
        scope: {
            href: '@',
            fallback: '@'
        },
        link: function(scope) {
            $http.get(scope.href)
                    .then(function(response) {
                        // Take the contents of the response and place into
                        // a scope variable for use in the template
                        scope.css = response.data;
                    })
                    .catch(function(response) {
                        // The request failed, so instead try loading from scope.fallback url.
                    });
        },
        template: '<style>{{ scope.css }}</style>'
    }
});

HTML:

<custom-style href="{{ urlToAppCSS }}" fallback="content/css/app.css"></custom-style>

您可能希望同时加载后备CSS,以便在请求的CSS文件无法加载的情况下不会有很长的延迟,但这可能是一个很好的起点。

答案 1 :(得分:0)

我最终保持它基本只是在我的控制器中进行$ http调用并在需要时更改href值,似乎非常干净。将硬编码的CSS加载到链接标记中,然后当我的主题被加载时,触发控制器代码的事件触发,在$ http成功时交换href值。

<link id="appCSS" href="content/css/app.css" rel="stylesheet">

控制器

        var appCSS = angular.element('#appCSS');

        // Try appCSS
        $http.get(theme.urlToAppCSS).then (function (response) {
            // GET succeeded, load up new CSS
            appCSS.attr('href', theme.urlToAppCSS);
        }, function (err) {
            // GET failed, keep default CSS in place
        });