18

我正在尝试使用 Angular js 将 css 动态添加到我的 html 头中。这是示例代码

<div ng-repeat="stylesheet in stylesheets">
        <link href="/myapp/{{stylesheet.href}}" type="{{stylesheet.type}}" rel="stylesheet" media="{{stylesheet.media}}" title="{{stylesheet.title}}" />
</div>

此代码按预期工作,但是当浏览器加载页面时,它会尝试使用原始 angularjs 模板获取 css 资源,并且我在 firebug 的网络选项卡中看到“404 not found error”。

Eg: request http://localhost:8080/myapp/%7B%7Bstylesheet.href%7D%7D, status 404

当页面完全加载时,它会替换模板值并加载适当的 css。

有没有办法避免 404 错误并使其在 angularjs 处理后加载 css?

4

5 回答 5

31

您应该使用ng-href而不是 href。

<link ng-repeat="stylesheet in stylesheets" ng-href="{{stylesheet.href}}" type="{{stylesheet.type}}" rel="stylesheet" />

例子

于 2012-08-11T08:22:37.647 回答
7

我制作了一个 AngularJS 服务,以便轻松使用 @Artem 解决方案。

它在 GitHub 上

于 2013-05-16T13:31:44.510 回答
2

还有一个使用 $route.resolve 和 promises 的选项。这将等到 CSS 实际加载后,不仅添加到头部(之后浏览器才开始检索文件,并且根据 CSS 大小可能会导致页面重排)。

// Routing setup
.config(function ($routeProvider) {
  $routeProvider
  .when('/home', {
      controller: 'homeCtrl', 
      templateUrl: 'home.tpl.html'
  }).when('/users', {
      controller: 'usersCtrl', 
      controllerAs: 'vm',
      templateUrl: 'users.tpl.html',
      resolve: {
        load: ['injectCSS', function (injectCSS) {
          return injectCSS.set("users", "users.css");
        }]
      }
  }).otherwise({
      // default page
      redirectTo: '/home'
  });
})

服务实施

.factory("injectCSS", ['$q', '$http', 'MeasurementsService', function($q, $http, MeasurementsService){
  var injectCSS = {};

  var createLink = function(id, url) {
    var link = document.createElement('link');
    link.id = id;
    link.rel = "stylesheet";
    link.type = "text/css";
    link.href = url;
    return link;
  }

  var checkLoaded = function (url, deferred, tries) {
    for (var i in document.styleSheets) {
      var href = document.styleSheets[i].href || "";
      if (href.split("/").slice(-1).join() === url) {
        deferred.resolve();
        return;
      }
    }
    tries++;
    setTimeout(function(){checkLoaded(url, deferred, tries);}, 50); 
  };

  injectCSS.set = function(id, url){
    var tries = 0,
      deferred = $q.defer(),
      link;

    if(!angular.element('link#' + id).length) {
      link = createLink(id, url);
      link.onload = deferred.resolve;
      angular.element('head').append(link);
    }
    checkLoaded(url, deferred, tries);

    return deferred.promise;
  };

  return injectCSS;
}])

如果这是您想要包含的内容,您可以使用尝试添加超时。

查看这篇文章了解更多详情:https ://medium.com/angularjs-meetup-south-london/angular-dynamically-injecting-css-file-using-route-resolve-and-promises-7bfcb8ccd05b

于 2015-01-30T19:06:20.310 回答
2

我创建了一个非常简单的示例,说明如何进行有条件的 CSS 添加

<link rel="stylesheet" ng-if="lang_direction == 'rtl'" ng-href="{{lang_direction == 'rtl' ? 'css/rtl.css' : ''}}" >
于 2015-02-23T12:45:41.440 回答
0

对于任何希望在运行时使用 AngularJS 创建真正动态的 CSS 的人来说,这就是我所使用的。

索引.html

<head> <style type="text/css" ng-bind-html="styles"></style> </head>

css服务

this.$rootScope.myStyles = ".test { color : red; }";

这只是一个例子,如果你有一个 indexController 并保持它远离,最好将样式放入 indexController$rootScope

于 2016-12-15T15:26:32.960 回答