Angularjs:查找指令的所有实例

时间:2013-04-04 04:36:19

标签: angularjs angularjs-directive

我正在尝试创建一个指令,允许用户使用箭头按部分导航页面。但是我也希望能够将这些部分分散在dom周围,并且在添加和删除内容时不要破坏它们。我可以想到几种方法,但没有一种方法令人满意:

  • 使用控制器创建一个指令,该控制器允许其他指令自行注册(并在$ destroy上取消注册)。但如果我稍后在中间添加一些东西,这将会失灵。另外,我尝试用这种方式编写代码,似乎代码多于必要的代码。

  • 每当用户点击一个箭头键,创建一个空数组,然后$广播一个事件,并通过回调指令在该列表上注册自己。然后,一旦该列表已满,则前进或后退。他们(应该?)按照他们在DOM上的顺序回来,但我不确定,因为这种方式看起来很疯狂和hackish。

  • 使用css标记“tabbable”的内容,并在jquery中以简单的方式编写,如下所示:在新的单击事件var all = $('.tabbable')上,然后用它做明显的事情。但我真的不想那样做,因为它不是'有角度'的方式。不是出于某种纯洁感,而是因为我将它构建为更大的小部件库的一部分,我希望这些功能可以访问它们。

那么,有没有办法让我获得某种类型的所有指令的范围,而不是诉诸于奇怪的黑客,或者将逻辑分散到各处?

2 个答案:

答案 0 :(得分:5)

这是一个很好的问题。 1

首先,按类型查找所有指令或节点违反了Angular方式。 View是AngularJS中的官方记录,所以指令应该说明他们做了什么,做了他们说的话。在某处编写某个进程以扫描DOM节点并相应地执行操作是有问题的,原因有几个,其中最重要的是关注点和可测试性的分离。

我很高兴看到您正在考虑其他选项,但我同意您提供的其他选项因您提到的原因而不是最佳选择。但我还有一个。这是我用于不同应用程序的一个,但需要分散DOM节点的知识。

首先,我们创建一个服务来管理该组件的状态。这很简单。我们称之为SectionsService。接下来,我们创建一个注册节的指令。为简单起见,我们称之为sectionsection指令在链接阶段使用SectionsService注册DOM节点的ID(可能以编程方式创建以确保唯一性)。由于DOM(大部分)按顺序处理,因此添加到SectionsService的节点也将按顺序排列。所以DOM看起来像这样(省略了无关的东西):

<div section>...</div>

<!-- other stuff -->

<div section>...</div>

<!-- other stuff -->

<!-- etc. -->

(虽然这里的范围超出范围,但是以这样的方式对它进行编程并不是很困难,以至于订单无关紧要,但它是基于我不知道的应用程序的细节。)

接下来,您将创建触发器,如箭头键处理程序。在这些事件中,您只需告诉SectionService转到列表中的上一个/下一个节点。 AngularJS附带了一个名为$anchorScroll的服务,可用于模拟我们熟悉的浏览器基于散列的定位。显然,如果你愿意,你还可以使用jQuery插件为滚动设置动画。

就是这样!一个非常简单的指令,一个相当简单的服务,以及您需要的任何触发器。总而言之,我猜不到100行代码,包括测试。所有组件都是分离的,易于测试,但仍然非常简单。观点仍然是真相。保留了Angular Way。

并且非常高兴。


我希望这会让你朝着正确的方向前进,但当然可以随意提出一个后续问题。如果您愿意,我们也可以谈论代码细节;正如我所说,他们不会很复杂。

答案 1 :(得分:2)

AngularJS services是单身,可以通过依赖注入来获取。您可以让您的指令需要状态管理器服务并调用增量器/减量器。

或者,更简单但更脆,你可以在$ rootScope中保留一个数组。它比jquery选择器全局更具惯用性“角度”(但不是很多),但如果你正在构建一个小部件库,它可能不是最好的路径。