【发布时间】:2013-10-05 06:38:29
【问题描述】:
这有点复杂,所以请耐心等待。我有三层指令:
- 顶层 - 弹出指令
- 中间层 -
switch-pane指令 * - 底层 - 几个视图之一
顶层只是一些弹出窗口,代表我的应用程序中的向导。
中间层是我制定的指令,它充当视图堆栈——您可以“推送”和“弹出”视图。显示“顶部”视图,其余部分被推到一边并模糊。
底层是一堆通常互不相关的视图,根据用户的操作动态加载并显示在switch-pane中。
到目前为止,这是可行的,但是:目前,顶层的 $scope 有一个数组属性,表示 switch-pane 应该显示的所有视图,作为属性传递给 switch-pane 指令,以及 @987654326 @ 指令 $watches 它并更新自己。
这没问题,但我认为这还不够好 - 我希望 switch-pane 指令本身来管理它的视图堆栈,并且只公开一个 push 和 pop API。
以下是我想到的几种方法:
- 使用
$broadcast/$emit- 顶层将广播“推送”事件,switch-pane将捕获它并执行所需的任何操作 - 使用服务(订阅并触发“推送”事件 - 这与使用
$broadcast类似,但不会在整个范围树中传播 - 使用允许
switch-pane指令注册它自己的API 的服务。使用某种方式来识别它,例如属性甚至元素 ID - 使用
angular.element().scope()访问switch-pane的内部工作
坦率地说,我不太喜欢这些方法中的任何一种。当然我想避免被绑定到 DOM,所以最后两个是最糟糕的。
还有其他方法吗?考虑到除了通过 DOM 之外,我们真的无法访问指令的某些实例,这是最 Angular 的暴露指令 API 的方式?
【问题讨论】:
-
也许值得补充一点:
emit方法和类似的“全局事件”解决方案的问题是 - 识别事件的来源。如果我有 2 个这样的 switch-pane 指令,我如何将我的“push”事件指向一个特定的,而不将自己绑定到当前的 DOM 结构? (即不使用指令的元素 ID)
标签: javascript angularjs mvvm