2013-03-22 7 views
9

Aktualnie tworzę aplikację z opcją zmiany motywu. Motyw w tym przypadku polega po prostu na zmianie koloru kilku kluczowych elementów w aplikacji.Aktualizowanie stylu CSS na całym świecie za pomocą zmiennej w zakresie

Obecnie, we wszystkich elementach wymagających koloru motywu, podałem im klasę css has-main-color.

W kontrolerze dostaję żądany kolor z usługi internetowej i ustawię go w zakresie jako $scope.mainColor = color;.

Wszystko to działa dobrze, ale problemem jest to, że nie mogę znaleźć odpowiedniej metody zastosowania tego koloru do klasy has-main-color.

Obecnie usiłuję następujące:

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

Jak można się domyślić, to nie działa tak dobrze.

Jakie byłoby najlepsze podejście do rozwiązania tego problemu za pomocą AngularJS?

+3

style wewnątrz zostaną zastosowane tylko raz. Więc zmiana zawartości wewnątrz dynamicznie nie pomaga. – ganaraj

Odpowiedz

10

Spójrz na stronie dokumentacji dla ngStyle. Ma prawie dokładnie to, co chcesz.

<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

Zrobiłem trochę badań w stylu ng i okazało się, że to jest dokładnie to, czego potrzebuję. Dziękuję za pomoc – Sam

+0

@Ryan, będzie działać, jeśli otrzymam style CSS z moich API Drupal? Przypuśćmy, że mam aplikację dla różnych grup osób, która jest zaangażowana w markę tego użytkownika, muszę zmienić, kolor css, czcionkę itp. – Smitha

7

Nie sądzę, można użyć class to zrobić, jednak spróbować tego

<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

Innym łatwo naprawić

<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

to właśnie szukałem. dzięki Arun – Lal

+0

Tthis nie działał w IE dla mnie – Shamseer

6

Jeśli ktoś chciałby używać oryginalnego podejścia, natknąłem się na ten sam problem dzisiaj i rzucił razem (małe!) Dyrektywa o stylu, który pozwala na kanciastych wyrażeń wewnątrz arkuszy stylów inline.

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

Umożliwia

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

z bg koloru dołączony do właściwego zakresu.

+0

Heh, dobra robota!Przez ostatnie 3 miesiące robiłem to samo, więc warto się przyjrzeć - patrz: [ngCss] (http://opensourcetaekwondo.com/ngcss)/[on GitHub] (https: // github. com/campbeln/ngCss). Problem, który widzę z twoją, musi znajdować się w zasięgu, aby mógł działać (więc albo mieć 'ng-kontroler' na tagu HTML albo mieć STYLE w linii). Ale znowu, twoja jest 13 liniami kodu, a moja niedawno wkradła się przez 650 linii;) – Campbeln

+0

@deanmcpherson, Proste i czyste! Dziękuję za podzielenie się! –

+0

Znaleziono to, co nie wymaga niestandardowej dyrektywy. http://stackoverflow.com/a/29309120/3291253 –

Powiązane problemy