这有点复杂所以请耐心等待。我有三层指令:
switch-pane
指令* 顶层只是一些代表我的应用中的向导的弹出窗口。
中间层是我所做的一个指令,它充当一堆视图 - 你可以“推”和“弹出”视图。显示“顶部”视图,其余部分被推到一边并模糊。
底层是一堆通常彼此无关的视图,它们根据用户的操作动态加载并显示在switch-pane
中。
到目前为止,这是可行的,但是:目前,顶层的$scope
有一个数组属性,表示switch-pane
应该显示的所有视图,作为一个传递给switch-pane
指令属性和switch-pane
指令$watch
es并更新自身。
这没关系,但我认为它不够好 - 我希望switch-pane
指令本身能够管理它的视图堆栈,并且只展示push
和pop
API。 / p>
以下是我想到的几种方式:
$broadcast
/ $emit
- 顶层将广播一个“推送”事件,而switch-pane
将抓住它并做任何需要的事情$broadcast
但不会在整个范围树中传播switch-pane
指令注册自己的API的服务。使用某种方式识别它,例如属性或甚至元素ID angular.element().scope()
访问switch-pane
的内部工作还有其他方法吗?考虑到除了通过DOM之外,我们实际上无法访问指令的某个实例,这是Angular-ish最常用的方式来公开指令的API?
答案 0 :(得分:0)
您可以查看ng-form
,ng-model
和ng-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