2013-03-22 22 views
9

我目前正在构建一个可以选择更改主题的应用程序。在这个例子中,主题只是改变应用程序中几个关键元素的颜色。使用范围变量全局更新CSS样式

因此,目前,在所有需要主题颜色的元素上,我给了他们css类has-main-color

在控制器中,我从Web服务获得了他们想要的颜色,并将其设置为$scope.mainColor = color;

所有这些工作正常,但我得到的问题是,我找不到合适的方法将此颜色应用于has-main-color类。

目前,我尝试以下:

<style> 
    .has-main-color { 
     color: {{mainColor}} 
    } 
</style> 

正如你或许可以猜到,这不工作这么好。

那么使用AngularJS解决这个问题最好的方法是什么?

+3

中的样式只能应用一次。所以改变它里面的内容动态不起作用。 – ganaraj 2013-03-22 15:04:04

回答

10

查看文档页ngStyle。它几乎正是你想要的。

<input type="button" value="set" ng-click="myStyle={color:'red'}"> 
<input type="button" value="clear" ng-click="myStyle={}"> 
<br/> 
<span ng-style="myStyle">Sample Text</span> 
<pre>myStyle={{myStyle}}</pre> 
+0

我对ng样式做了一些研究,结果证明这正是我需要的。感谢您的帮助 – Sam 2013-03-28 01:51:16

+0

@Ryan,如果我从我的Drupal API接收到CSS样式,它会工作吗?假设我有一个针对不同人群的应用程序,基于该用户的品牌,我需要更改,CSS颜色,字体等。 – Smitha 2016-05-04 14:03:51

7

我不认为你可以使用class要做到这一点,但是试试这个

<div ng-app="test-app" ng-controller="MyController" theme-wrapper="{{mainColor}}"> 
    <div class="has-main-color">Top1</div> 
    <div>Child 1</div> 
    <div class="has-main-color">Top1</div> 
    <div>Child 1</div> 
    <div class="has-main-color">Top1</div> 
    <div>Child 1</div> 
    <br /> 
    <input type="button" value="Red" ng-click="color('red')" /> 
    <input type="button" value="Green" ng-click="color('green')" /> 
    <input type="button" value="Blue" ng-click="color('blue')" /> 
</div> 

JS

var app = angular.module('test-app', []); 

app.controller('MyController', function($scope, $rootScope, $timeout){ 
    $scope.mainColor = 'grey'; 
    $scope.color = function(color) { 
     $scope.mainColor = color; 
    } 
}); 

app.directive('themeWrapper', function(){ 
    var counter = 0, regex = /^theme-wrapper-\d+$/; 
    return { 
     restrict: 'A', 
     link: function(scope, elm, attrs){ 
      attrs.$observe('themeWrapper', function(value){ 
       var className = 'theme-wrapper-' + (counter++); 
       $('<style>.' + className + ' .has-main-color{color: ' + value + ';}</style>').appendTo('head'); 

       var classes = elm.attr('class').split(' '); 
       angular.forEach(classes, function(v, i){ 
        if(regex.test(v)) { 
         elm.removeClass(v); 
        } 
       }); 

       elm.addClass(className); 
      }); 
     } 
    } 
}); 

演示:Fiddle

另一个简单的办法

<div ng-app="test-app" ng-controller="MyController"> 
    <div style="color: {{mainColor}}">Top1</div> 
    <div>Child 1</div> 
    <div style="color: {{mainColor}}">Top1</div> 
    <div>Child 1</div> 
    <div style="color: {{mainColor}}">Top1</div> 
    <div>Child 1</div> 
    <br /> 
    <input type="button" value="Red" ng-click="color('red')" /> 
    <input type="button" value="Green" ng-click="color('green')" /> 
    <input type="button" value="Blue" ng-click="color('blue')" /> 
</div> 

个JS

var app = angular.module('test-app', []); 

app.controller('MyController', function($scope, $rootScope, $timeout){ 
    $scope.mainColor = 'grey'; 
    $scope.color = function(color) { 
     $scope.mainColor = color; 
    } 
}) 

演示:Fiddle

+0

这是我正在寻找。感谢Arun – Lal 2013-10-31 23:33:28

+0

Tthis在IE中不起作用 – Shamseer 2016-03-16 21:57:29

6

如果有人想用原来的方法,我碰到了同样的问题,今天来,扔在一起的(很小的!)指令的风格,允许内嵌样式表内的角度表达。

https://github.com/deanmcpherson/angular-inline-style

允许对

body { background-color: {{bgColor}}; } 

与连接到适当范围背景颜色。

+0

嘿,不错的工作!在过去的3个多月中,我一直在做同样的事情,所以可能值得一看:[ngCss](http://opensourcetaekwondo.com/ngcss)/ [在GitHub上](https:// github。 COM/campbeln/ngCss)。我与你们见面的问题需要在它的工作范围之内(所以要么在HTML标签上使用'ng-controller',要么使STYLE在线)。但是,再次,你的代码是13行,而我最近爬过了650行;) – Campbeln 2015-01-21 02:39:31

+0

@deanmcpherson, 简单而干净!感谢你的分享! – 2015-10-02 14:27:54

+0

发现这不需要自定义指令。 http://stackoverflow.com/a/29309120/3291253 – 2015-10-02 18:47:49