这有点复杂,所以请耐心等待。我有三层指令:
- 顶层 - 弹出指令
- 中间层 - 一个
switch-pane
指令 * - 底层 - 几个视图之一
顶层只是一些弹出窗口,代表我的应用程序中的向导。中间层是我制定的指令,它充当视图堆栈——您可以“推送”和“弹出”视图。显示“顶部”视图,其余部分被推到一边并模糊。底层是一堆通常彼此无关的视图,switch-pane
根据用户的操作动态加载并显示在视图中。
到目前为止,这是可行的,但是:目前,顶层$scope
有一个数组属性,该属性表示应显示的所有视图,作为属性switch-pane
传递给指令,指令对其进行自我更新。这没关系,但我认为这还不够好 - 我希望指令本身来管理它的视图堆栈,并且只公开一个和API。switch-pane
switch-pane
$watch
switch-pane
push
pop
以下是我想到的几种方法:
- 使用
$broadcast
/$emit
- 顶层将 $broadcast 一个“push”事件,switch-pane
并将捕获它并做它需要的任何事情 - 使用服务(订阅并触发“推送”事件 - 这就像使用
$broadcast
但不会在整个范围树中传播 - 使用允许
switch-pane
指令注册它自己的 API 的服务。使用某种方式来识别它,例如属性甚至元素 ID - 用于
angular.element().scope()
访问switch-pane
的内部工作
坦率地说,我不太喜欢这些方法。当然我想避免被绑定到 DOM,所以最后两个是最糟糕的。
还有其他方法可以做到这一点吗?考虑到除了通过 DOM 之外,我们实际上无法访问某个指令的某个实例,哪种方式是暴露指令 API 的最 Angular 方式?