2013-01-14 17 views
8

Dla jedynego edytora wizualnego próbuję stworzyć nową dyrektywę, która zapisuje styl CSS. Utknąłem w próbach uaktualnienia dyrektywy po kliknięciu pola wyboru, aby uczynić właściwość koloru tła przezroczystą.Utknąłem tworząc niestandardową dyrektywę stylu CSS

Oto mój (bez pracy) dyrektywy:

myApp.directive('customstyle', function() { 
return { 
    restrict: 'E', 
    link: function (scope, element, attrs) { 
     var bgColor; 
     scope.$watch(attrs.myTransparent, function (value) { 
     if (value) { 
      bgColor = 'transparent'; 
     } else { 
      bgColor = attrs.myBgcolor; 
     } 
     updateStyle(); 
     }, true); 

     function updateStyle() { 
     var htmlText = '<style>.' + attrs.myClass + '{'; 
     htmlText += 'background-color: ' + bgColor + ';'; 
     htmlText += "}</style>"; 
     element.replaceWith(htmlText); 
     } 
     updateStyle(); 
    } 
} 
}); 

i html elementem:

<customstyle my-class="examplediv" my-transparent="settings.Window.Transparent" my-bgcolor="settings.Window.BackgroundColor"></customstyle> 

Oto jsfiddle sytuacji: http://jsfiddle.net/psinke/jYQc6/

Każda pomoc będzie mile widziana.

Odpowiedz

17

Spróbuj użyć dyrektywy bezpośrednio na elemencie, który chcesz zmienić, łatwiej to zrobić i zachować.

HTML:

<div class="examplediv customstyle" 
    my-transparent="settings.Window.Transparent" 
    my-bgcolor="{{settings.Window.BackgroundColor}}"> 
</div> 

Uwaga: Użycie {{settings.Window.BackgroundColor}} przekazać wartość właściwości, a nie ciąg.

dyrektywa:

myApp.directive('customstyle', function() { 
    return { 
     restrict: 'AC', 
     link: function (scope, element, attrs) {   
      scope.$watch(attrs.myTransparent, function (value) {  
      element.css('background-color', (value ? 'transparent' : attrs.myBgcolor));    
      });      
     } 
    } 
}); 

Uwaga: Użycie element.css() zmienić właściwości CSS bezpośrednio na elemencie.

jsFiddler: http://jsfiddle.net/jYQc6/8/

+0

Dzięki za odpowiedź. Na stronie, której będę używał, styl zostanie zastosowany do nieznanej liczby elementów na liście, więc ustawienie właściwości css dla każdego elementu nie wydaje się być właściwą drogą. Udało mi się sprawić, że działa. Okazało się, że musiałem przetworzyć wartość pola wyboru na wartość boolowską, aby uruchomić ją. I nie zamieniłem elementu, ale zmienię w nim html. Nadal nie jestem pewien, czy jest to najlepszy sposób na zrobienie tego. Mam trochę więcej do zrobienia, jak sądzę. Oto działająca jsfiddle: http://jsfiddle.net/psinke/YJxR9/ –

+0

@Peter, $ observe zawsze zwróci ciąg znaków, więc zamiast 'if (parseBool (myBool)) {' możesz po prostu zrobić to: 'if (myBool == "true") {. (Model ng użyje tylko wartości 'true' i' false' dla pola wyboru, więc nie trzeba szukać innych możliwych wartości boolowskich.) –

1

I było to, że ten sam problem, stosując roztwór bmleite za rozwiązany. Miałem niestandardowy element z niestandardowym atrybutem bardzo podobnym do powyższego, a zmiana dyrektywy, która ma być zastosowana w zwykłym DIV zamiast niestandardowego atrybutu, naprawiła go dla mnie.


W moim rozwiązanie mam również następujące linijki kodu tuż po element został zmodyfikowany:

$compile(element.contents())(scope); 


Pamiętaj, aby wprowadzić usługę $ kompilacji w deklaracji funkcji dyrektywy:

myApp.directive('directiveName', function ($compile) { ... 


Dzięki za świetny post!