Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在多层嵌套指令之间通信_Javascript_Angularjs_Mvvm - Fatal编程技术网

Javascript 在多层嵌套指令之间通信

Javascript 在多层嵌套指令之间通信,javascript,angularjs,mvvm,Javascript,Angularjs,Mvvm,这有点复杂,请容忍我。我有三层指令: 顶层-弹出指令 中间层-开关面板指令* 底层-多个视图之一 顶层只是一些弹出窗口,代表我的应用程序中的一个向导。 中间层是我制作的一个指令,它充当一个视图堆栈——您可以推送和弹出视图。此时将显示顶视图,其余视图被推到一边并模糊。 底层是一组通常互不相关的视图,这些视图根据用户的操作动态加载并显示在交换机窗格中 到目前为止,这是可行的,但是:目前,顶层的$scope有一个数组属性,它表示交换机窗格应该显示的所有视图,作为属性传递给交换机窗格指令,而交换机窗格指

这有点复杂,请容忍我。我有三层指令:

顶层-弹出指令 中间层-开关面板指令* 底层-多个视图之一 顶层只是一些弹出窗口,代表我的应用程序中的一个向导。 中间层是我制作的一个指令,它充当一个视图堆栈——您可以推送和弹出视图。此时将显示顶视图,其余视图被推到一边并模糊。 底层是一组通常互不相关的视图,这些视图根据用户的操作动态加载并显示在交换机窗格中

到目前为止,这是可行的,但是:目前,顶层的$scope有一个数组属性,它表示交换机窗格应该显示的所有视图,作为属性传递给交换机窗格指令,而交换机窗格指令$监视并更新它自己。 这还可以,但我认为还不够好——我希望switch-pane指令本身能够管理它的视图堆栈,并且只公开一个push-and-pop API

以下是我想到的几种方法:

使用$broadcast/$emit-顶层将$broadcast一个推送事件,交换机窗格将捕获它并执行它需要的任何操作 使用服务订阅并触发推送事件-这与使用$broadcast类似,但不会在作用域树中传播 使用允许switch pane指令注册自己API的服务。使用某种方法来识别它,比如属性,甚至元素ID 使用angular.element.scope访问开关窗格的内部工作 坦率地说,我不太喜欢这些方法中的任何一种。当然,我想避免与DOM绑定,所以最后两个是最差的

还有其他方法吗?考虑到我们除了通过DOM之外实际上无法访问指令的特定实例,哪种方法是公开指令API的最简单的方法?

您可以检查ng表单、ng模型和ng输入是如何实现的。基本上,如果表单有一个名称,例如它的控制器发布到当前作用域,在本例中是在$scope.foo变量下。发布控制器后,可以在ng form指令之外使用其API

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


下面是我的项目中的一个例子。这是一种用jQuery编写的jqGrid grid插件的包装器:

require解决方案,如Angular的主页示例和您的回答中所示,与我的情况相反-您可以使用require:^parentController访问父级的各种API,但我需要的是顶层的父级来访问其中包含的指令上的一些API。也许值得补充一点:emit方法和类似的全局事件解决方案的问题是——识别事件的源。如果我有两个开关面板指令,如何将推送事件定向到特定的一个,而不将自己绑定到当前DOM结构?不使用指令的元素ID的ie