我目前正在构建一个可以选择更改主题的应用。在这个例子中的一个主题,只需要改变应用程序中几个关键元素的颜色。
所以目前,在所有需要主题颜色的元素上,我都给了它们css类has-main-color
。
在控制器中,我从Web服务获取所需的颜色,并将其设置为范围$scope.mainColor = color;
。
所有这一切都很好,但我遇到的问题是我找不到合适的方法将这种颜色应用到has-main-color
类。
目前,我正在尝试以下方法:
<style>
.has-main-color {
color: {{mainColor}}
}
</style>
正如你可能猜到的那样,这种效果并不好。
那么使用AngularJS解决这个问题的最佳方法是什么?
答案 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颜色附加到适当的范围。