2012-12-31 14 views
10

Mam listę słów z liczbą (smugą) przypisaną do każdego słowa. Ustawiam kolor tła każdego słowa na podstawie numeru przypisanego do niego przy użyciu ng-stylu AngularJS.Zmiana koloru tła po najechaniu kursorem po ustawieniu stylu z użyciem stylu ng

html

<ul class="unstyled"> 
    <li class="tHi" ng-repeat="item in items" ng-click="getEdit(item.word)" ng-style="bgstyle(item.streak)"> 
     <span>{{item.word}} {{item.streak}}</span> 
    </li> 
    </ul> 

javascript, która jest wywoływana z NG-stylu.

$scope.bgstyle = function (streak) { 
    var red = 255; 
    var green = 255-streak; 
    var blue = 255-streak; 
    var rgb = blue | (green << 8) | (red << 16); 
    var sColor = '#' + rgb.toString(16); 
    return {backgroundColor: sColor}; 
} 

Działa to jednak, chciałbym podświetlić tło, gdy mysz unosi się nad słowem. Dodałem klasę "tHi", która normalnie zmieniałaby tło po najechaniu kursorem, ale została nadpisana przez dodany styl.

Oto jsfiddle, który demonstruje ten problem.

Czy istnieje lepszy sposób ustawiania tła niż styl ng, aby odpowiadał numerowi przypisanemu do każdego słowa? A może jest jakiś sposób podkreślenia, gdy użytkownik unosi się nad słowem?

Odpowiedz

11

Jest to jeden z nielicznych przypadków, gdzie ja właściwie zalecamy użycie !important w CSS:

.tHi:hover { 
    cursor: pointer; 
    background-color: #9f9 !important; 
} 

Updated JS Fiddle demo.

Używanie słowa kluczowego !important istocie powoduje, że reguła będzie stosowana niezależnie od specyfiki selektora (zakładając, że bardziej specyficzne selektor nie również mają słowa kluczowego !important, oczywiście). To ma, jednak mają potencjał, aby zrobić debugowanie dość trudne, jeśli ty lub twoi współpracownicy, zapomnij o użyciu !important.

Odniesienia:

9

Jeśli nie chcesz używać !important można dodać klasę dynamicznie przy użyciu ng-mouseover:

<li ng-repeat="item in items" ng-click="getEdit(item.word)" 
    ng-style="bgstyle(item.streak)" ng-mouseover="hover($event)"> 

następnie dodać do kontrolera:

$scope.hover = function(e) { 
    angular.element(e.srcElement).addClass('tHi') 
} 

Manipulowanie DOM w sposób kontroler nie jest "najlepszą praktyką". Dyrektywa byłaby lepsza.

Aktualizacja: Oto dyrektywa

myApp.directive('ngHover', function() { 
    return { 
    link: function(scope, element) { 
     element.bind('mouseenter', function() { 
      angular.element(element.children()[0]).addClass('tHi') 
     }) 
    } 
    } 
}); 

children()[0] służy zastosować klasę do rozpiętości, a nie li, tak aby nie kolidować z NG-stylu.

Zastosowanie następująco:

<li ng-repeat="item in items" ng-click="getEdit(item.word)" 
    ng-style="bgstyle(item.streak)" ng-hover> 

Fiddle

+1

Podoba mi się twoja odpowiedź jako przykład użycia dyrektywy i ng-mouseover. Dziękuję Ci. Również twoja odpowiedź uświadomiła mi coś, co wcześniej mi się nie przydarzyło. Najprostszym rozwiązaniem byłoby dodanie klasy "tHi" do zakresu, a nie do li. W ten sposób nie potrzebuję! Ważne ani dyrektywy. Tak jak powiedziałeś, unikasz konfliktu ze stylem ng. – Daniel

+1

Wielka obserwacja. (I unika tego dodatkowego wiązania zdarzeń i oglądania $). –

+0

To jest całkowicie ortogonalny komentarz, ale jeśli tylko stosujesz klasę do stylu, zawsze możesz użyć dobrego ol CSS i zdefiniować: hover. – chug2k

4

znalazłem przez dyrektywy był najłatwiejszy sposób.

App.directive('attr', function(){ 
    return function(scope, element) { 
     element.bind('mouseenter', function(){ 
      element.addClass('hover'); 
     }).bind('mouseleave', function(){ 
      element.removeClass('hover'); 
     }) 
    } 
}) 
Powiązane problemy