>使用控制器创建一个指令,允许其他指令注册自己(并在$destroy上注销).但是如果我稍后再添加一些东西,这将是无序的.此外,我已经尝试这样写,似乎更多的代码是必要的.
>每当用户点击一个箭头键,创建一个空数组,并且$播放一个事件,一个回调指令用于在该列表中注册自己.然后,一旦该列表已满,提前或后退.他们(应该)按照他们在DOM上的顺序回来,但我不知道,因为这样看起来很疯狂和黑客.
>使用css标记’tabbable’的东西,并在jquery中写这个简单的方式,就像这样:在一个新的click事件中,var all = $(‘.tabbable’),然后用这个明显的方法.但是我真的不想这样做,因为它不是“有角度”的方式.不是出于某种纯洁的感觉,而是因为我正在构建一个更大的小部件库的一部分,而且我希望这个功能是可以接受的.
那么,我有什么办法可以获得某种类型的所有指令的范围,而不是诉诸奇怪的黑客,还是将逻辑推广到整个地方?
首先,通过类型查找所有指令或节点与Angular方式相反.视图是AngularJS的官方记录,所以指令应该说他们做什么,做他们说的话.在某处扫描某些DOM节点并进行相应的处理是有问题的,原因有几个,其中最重要的是分离问题和可测试性.
我很高兴看到您正在查看其他选项,但我同意您提供的其他选项是次优的,因为您提到的原因.但我还有一个.这是我用于不同应用程序的,但这需要知道分散的DOM节点.
首先,我们创建一个服务来管理这个组件的状态.这很简单.我们称之为SectionsService.接下来,我们创建一个注册部分的指令.我们来简单的说一下这个部分. section指令在链接阶段注册了DOM节点的ID(可能以编程方式创建以确保唯一性)与SectionsService进行注册.由于DOM被按顺序处理(主要),所以添加到SectionsService的节点也将按顺序排列.所以DOM看起来像这样(不相关的东西省略):
<div section>...</div> <!-- other stuff --> <div section>...</div> <!-- other stuff --> <!-- etc. -->
(尽管这里的范围不大,编程的方式并不是很困难,因为顺序不重要,但是它将基于我不知道的应用程序的细节.)
接下来,您创建触发器,如箭头键处理程序.在这些事件上,您只需要告诉SectionService去列表中的上一个/下一个节点. AngularJS提供了一个名为$anchorScroll
的服务,可用于模拟浏览器基于我们熟悉的基于哈希的定位.显然,您也可以使用jQuery插件来动画滚动,如果你想.
就是这样!一个非常简单的指令,一个相当简单的服务,以及你需要的任何触发器.总而言之,我猜测不到100行代码,包括测试.所有组件都是分离的,容易测试,但仍然非常简单.这个观点仍然是真相.角色保留.
还有很高兴.
我希望这能让你走向正确的方向,但当然可以随便问一个后续的问题.如果你愿意,我们也可以谈论代码细节;正如我所说,他们不会很复杂.