2013-03-22 3 views
9

Attualmente sto creando un'app con la possibilità di modificare il tema. Un tema in questo caso consiste semplicemente nel cambiare il colore di alcuni elementi chiave nell'app.Aggiornamento di uno stile CSS a livello globale con variabile nell'ambito

Così attualmente, su tutti gli elementi che richiedono il colore del tema, ho dato loro la classe css has-main-color.

Nel controller, ottengo il loro colore desiderato dal servizio Web e lo impostano nell'ambito come $scope.mainColor = color;.

Tutto questo funziona correttamente, ma il problema che sto ottenendo è che non riesco a trovare un metodo adatto per applicare questo colore alla classe has-main-color.

Attualmente, sto cercando il seguente:

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

Come si può intuire, questo non funziona così bene.

Quindi quale sarebbe l'approccio migliore per risolvere questo problema utilizzando AngularJS?

+3

stili all'interno dello applicati solo una volta. Quindi, cambiare il contenuto al suo interno in modo dinamico non aiuta. – ganaraj

risposta

10

Guardate la pagina di documentazione per ngStyle. Ha quasi esattamente quello che vuoi.

<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

Ho fatto un po 'di ricerche su ng-style, e si scopre che questo è esattamente ciò di cui ho bisogno. Grazie per l'assistenza – Sam

+0

@Ryan, funzionerà se ricevo gli stili css dalle mie API Drupal? Supponiamo di avere un'app per diversi gruppi di persone e basandomi sul marchio di quell'utente, ho bisogno di cambiare, colore CSS, font ecc. – Smitha

7

Non credo che è possibile utilizzare un class per fare questo, però provate questo

<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); 
      }); 
     } 
    } 
}); 

Demo: Fiddle

Un'altra soluzione semplice

<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; 
    } 
}) 

Demo: Fiddle

+0

questo è quello che stavo cercando. grazie Arun – Lal

+0

Tthis non ha funzionato in IE per me – Shamseer

6

Se qualcuno volesse usare il vostro approccio originale, mi sono imbattuto lo stesso problema di oggi e ha gettato insieme un (piccolo!) Direttiva per lo stile che permette di espressioni angolari all'interno di fogli di stile in linea.

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

Consente di

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

con il colore attaccato alla portata appropriata.

+0

Heh, bel lavoro!Negli ultimi 3+ mesi ho fatto la stessa cosa per cui valeva la pena dare un'occhiata: [ngCss] (http://opensourcetaekwondo.com/ngcss)/[su GitHub] (https: // github. com/campbeln/ngCss). Il problema che vedo con il tuo ha bisogno di essere all'interno di uno scope per farlo funzionare (quindi avere il 'ng-controller' sul tag HTML o avere lo STYLE in-line). Ma ancora una volta, le tue sono 13 linee di codice mentre la mia ha recentemente superato le 650 linee;) – Campbeln

+0

@deanmcpherson, Semplice e pulito! Grazie per aver condiviso! –

+0

Trovato ciò che non richiede una direttiva personalizzata. http://stackoverflow.com/a/29309120/3291253 –

Problemi correlati