78

我无法弄清楚如何让一个类在嵌套指令上进行更改。

这是外部 ng-repeat

<div data-courseoverview data-ng-repeat="course in courses | orderBy:sortOrder | filter:search"
         data-ng-controller ="CourseItemController"
         data-ng-class="{ selected: isSelected }">

下面是使用另一个指令的内部 ng-repeat

<li data-ng-repeat="item in social" class="social-{{item.name}}" ng-mouseover="hoverItem(true);"
    ng-mouseout="hoverItem(false);"
    index="{{$index}}"><i class="{{item.icon}}"
    box="course-{{$index}}"></i></li>

这是我调用悬停事件的指令

ecourseApp.directive("courseoverview", function() { 
  return {    
    restrict : 'A',    
    replace: true, 
    /*scope: {
        index: '@'
    },*/        
    transclude: true,      
    templateUrl: "views/course-overview.html",
    link: function link(scope, element, attrs) {
        scope.switched = false;
        //hover handler
        scope.hoverItem = function(hovered){
            if (hovered) {
                element.addClass('hover');
                $('#course-0 figure').addClass('tint')
            }
            else
                element.removeClass('hover');
        };
    }  
}});

这需要$('#course-0 figure').addClass('tint')更改调用项。

4

4 回答 4

147

一般来说,我完全同意 Jason 对 css 选择器的使用,但在某些情况下,您可能不想更改 css,例如在使用第 3 方 css 模板时,而是更喜欢在元素上添加/删除类。

以下示例显示了在 ng-mouseenter/mouseleave 上添加/删除类的简单方法:

<div ng-app>
  <div 
    class="italic" 
    ng-class="{red: hover}"
    ng-init="hover = false"
    ng-mouseenter="hover = true"
    ng-mouseleave="hover = false">
      Test 1 2 3.
  </div>
</div>

带有一些样式:

.red {
  background-color: red;
}

.italic {
  font-style: italic;
  color: black;
}

在此处查看运行示例:jsfiddle 示例

悬停样式是一个视图问题。尽管上面的解决方案在当前范围内设置了一个“悬停”属性,但控制器不需要关心这一点。

于 2013-10-29T15:15:16.567 回答
39

过去我在使用 IE 和 css:hover 选择器时遇到过问题,所以我采用的方法是使用自定义指令。

.directive('hoverClass', function () {
    return {
        restrict: 'A',
        scope: {
            hoverClass: '@'
        },
        link: function (scope, element) {
            element.on('mouseenter', function() {
                element.addClass(scope.hoverClass);
            });
            element.on('mouseleave', function() {
                element.removeClass(scope.hoverClass);
            });
        }
    };
})

然后在元素本身上,您可以添加指令以及当鼠标悬停在元素上时要启用的类名,例如:

<li data-ng-repeat="item in social" hover-class="hover tint" class="social-{{item.name}}" ng-mouseover="hoverItem(true);" ng-mouseout="hoverItem(false);"
                index="{{$index}}"><i class="{{item.icon}}"
                box="course-{{$index}}"></i></li>

这应该在鼠标悬停在元素上时添加类悬停和着色,并且不会冒范围变量名称冲突的风险。我还没有测试过,但是 mouseenter 和 mouseleave 事件应该仍然会冒泡到包含元素,所以在给定的场景中,以下应该仍然有效

<div hover-class="hover" data-courseoverview data-ng-repeat="course in courses | orderBy:sortOrder | filter:search"
 data-ng-controller ="CourseItemController"
 data-ng-class="{ selected: isSelected }">

当然,假设 li 实际上是父 div 的子级

于 2014-01-18T16:49:25.887 回答
15

这是我的方案的解决方案:

<div class="btn-group btn-group-justified">
    <a class="btn btn-default" ng-class="{'btn-success': hover.left, 'btn-danger': hover.right}" ng-click="setMatch(-1)" role="button" ng-mouseenter="hover.left = true;" ng-mouseleave="hover.left = false;">
        <i class="fa fa-thumbs-o-up fa-5x pull-left" ng-class="{'fa-rotate-90': !hover.left && !hover.right, 'fa-flip-vertical': hover.right}"></i>
        {{ song.name }}
    </a>
    <a class="btn btn-default" ng-class="{'btn-success': hover.right, 'btn-danger': hover.left}" ng-click="setMatch(1)" role="button" ng-mouseenter="hover.right = true;" ng-mouseleave="hover.right = false;">
        <i class="fa fa-thumbs-o-up fa-5x pull-right" ng-class="{'fa-rotate-270': !hover.left && !hover.right, 'fa-flip-vertical': hover.left}"></i>
        {{ match.name }}
    </a>
</div>

默认状态: 在此处输入图像描述

悬停时: 在此处输入图像描述

于 2013-11-13T11:20:49.690 回答
7

anchor我认为在 .周围放置标签会容易得多i。您可以只使用 css:hover选择器。更少的移动部件使维护更容易,加载更少的 javascript 使页面更快。

这可以解决问题:

<style>
 a.icon-link:hover {
   background-color: pink;
 }
</style>

<a href="#" class="icon-link" id="course-0"><i class="icon-thumbsup"></id></a>

jsfiddle 示例

于 2013-06-04T16:40:54.583 回答