【问题标题】:Communicating between multiple layers of nested directives在多层嵌套指令之间进行通信
【发布时间】:2013-10-05 06:38:29
【问题描述】:

这有点复杂,所以请耐心等待。我有三层指令:

  1. 顶层 - 弹出指令
  2. 中间层 - switch-pane 指令 *
  3. 底层 - 几个视图之一

顶层只是一些弹出窗口,代表我的应用程序中的向导。 中间层是我制定的指令,它充当视图堆栈——您可以“推送”和“弹出”视图。显示“顶部”视图,其余部分被推到一边并模糊。 底层是一堆通常互不相关的视图,根据用户的操作动态加载并显示在switch-pane中。

到目前为止,这是可行的,但是:目前,顶层的 $scope 有一个数组属性,表示 switch-pane 应该显示的所有视图,作为属性传递给 switch-pane 指令,以及 @987654326 @ 指令 $watches 它并更新自己。 这没问题,但我认为这还不够好 - 我希望 switch-pane 指令本身来管理它的视图堆栈,并且只公开一个 pushpop 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


【解决方案1】:

您可以查看ng-formng-modelng-input 是如何实现的。基本上,如果表单有一个名称,例如<form name="foo" ...>,它的控制器就会发布到当前范围,在这种情况下是在$scope.foo 变量下。控制器发布后,您可以在 ng-form 指令之外使用其 API。

如果指定了require: "^ngForm" 选项,您也可以从其他指令访问此控制器。

这是我的项目中的一个示例。它是用 jQuery 编写的 jqGrid 网格插件的一种包装器:https://github.com/9ci/angle-grinder/blob/06856b0d940b572960025f06f470c2f40fdc0ceb/app/scripts/modules/gridz.coffee#L12

【讨论】:

  • require 解决方案,如 Angular 的主页示例和您的回答所示,与我的情况相反 - 您可以使用 require: ^parentController 访问父母的各种“API”,但是什么我需要的是父级(顶层)来访问包含在 within 它的指令上的某些 API。
猜你喜欢
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 2016-03-31
  • 2013-09-09
  • 1970-01-01
相关资源
最近更新 更多