AngularJS:从隔离范围发送事件

时间:2013-04-21 21:41:03

标签: angularjs angularjs-directive angularjs-scope

我希望有一组可重复使用的小部件,可以在应用程序的任何地方使用。 对于前者我想要一个设置菜单和菜单项定义为嵌套自定义标签。我希望能够将菜单项或菜单中的事件发送到父上下文(父指令中的控制器或其他)。

但我发现了一些与范围有关的奇怪事情(也许我误解了一些事情):

<panel title="clock">
    <clock timezone="MST"></clock>
    <clock timezone="MST"></clock>
    <clock timezone="MST"></clock>
</panel>

以下示例在单击项目时不会将事件触发到父指令控制器: http://jsfiddle.net/9VTfR/2/

但以下工作正常: http://jsfiddle.net/9VTfR/3/

此外,我在控制台中为这两个选项都出现了一些奇怪的JS错误。

因此可以捕获任何级别的事件,因为父指令也应该是父作用域(不仅是父控制器),不是吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:6)

您看到控制台的错误是因为您在小提琴中包含两次Angular(一次在外部资源中;一次在Frameworks&amp; Extensions中)。

你的$scope.$on('clickObject')没有被解雇的原因是因为你的两个指令都是兄弟姐妹,而$emit只是向上通知

From the docs

  

通过范围层次结构向上调度事件名称,通知已注册的侦听器。

您可以使用$scope.$parentlike this),但会对您的指令的结构做出一些假设。您还可以使用$rootScopelike this),如果您不使用足够多的唯一事件名称,则很可能会遇到冲突。