【发布时间】:2014-03-11 00:51:47
【问题描述】:
我想构建一个弹出树形菜单,在悬停时向元素添加 active 类,并在其任何兄弟元素悬停时将其删除。
这样,当用户将鼠标移开时,菜单将保持打开状态。
弹出菜单是递归的,因为它可以是任意数量的深度。
为了从兄弟姐妹中删除一个班级,我必须了解他们的父母或兄弟姐妹的身份。更愿意使用数据结构来执行此操作,但如果需要,将使用 DOM 遍历。
我试过了:
- 在悬停处理程序中使用 scope.$parent(但处理程序知道的范围是指令范围,而不是 ng-repeat 范围)
- 将事件传递给悬停处理程序并调用
$(evt).siblings()(但角度大叫,说我无法从表达式访问 DOM) - 在本地 ng-repeat 范围内设置 .parent 属性(但事件处理程序无权访问模板继承的这些值)
- 使用递归指令,因此树中的每一片叶子都是另一个指令。这会使浏览器爆炸。 (我认为是因为它会在寻找循环中的退出条件之前尝试编译指令)
- 为树中的每个叶子添加一个控制器。这会使作用域树变大,并且不提供访问同级的干净方法。虽然它是功能性的。请参阅下面的答案。
我不知道如何在 Angular 中做到这一点。在 jQuery 中执行此操作非常简单:$(e.target).siblings().removeClass('active')。我怎样才能完成这项工作?
我制作了一个 Plunker 来演示在递归 ng-repeat 中访问同级的问题:http://plnkr.co/edit/vBYYt6sTvWKN9TXz9SC5?p=preview
【问题讨论】:
-
您查看过Creating Directives that Communicate 的文档吗?
-
是的。您是否建议我为树中的每个节点创建一个指令?可能是一个想法......
-
你试过 CSS :hover 伪类吗?
-
是的,我认为将逻辑放在指令中更有意义
-
@Stewie
:hover是这些通常的做法,但 UI 要求是菜单在离开后保持打开状态。
标签: angularjs angularjs-directive angularjs-ng-repeat