使用范围中的变量全局更新CSS样式

时间:2013-03-22 14:55:31

标签: css angularjs angularjs-scope

我目前正在构建一个可以选择更改主题的应用。在这个例子中的一个主题,只需要改变应用程序中几个关键元素的颜色。

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

在控制器中,我从Web服务获取所需的颜色,并将其设置为范围$scope.mainColor = color;

所有这一切都很好,但我遇到的问题是我找不到合适的方法将这种颜色应用到has-main-color类。

目前,我正在尝试以下方法:

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

正如你可能猜到的那样,这种效果并不好。

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

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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

答案 2 :(得分:7)

如果有人想要使用你的原始方法,我今天遇到了同样的问题,并将一个(小!)指令集合在一起,用于允许在内联样式表中使用角度表达式。

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

允许

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

将bg颜色附加到适当的范围。