【发布时间】:2014-08-18 13:05:55
【问题描述】:
我正在阅读有关控制器和指令之间通信的所有答案,但在我看来,这似乎是使用共享服务并将其注入其中的每一个。当我开发一个非常大规模的应用程序时,我不知道我的页面将包含什么内容。我可能有 2 个控制器需要在它们之间进行通信,并且我也可能在同一页面中有 5 个指令和 2 个控制器。我不知道从头开始我的视图/页面中会出现什么,所以我需要一种更好的方式来在它们之间进行通信。我正在寻找更好的方法,正确的 AngularJS 方法。
http://i60.tinypic.com/2z87q05.png
上面是我正在处理的视图示例: 在左侧我有一个指令树,在右侧我有图表控制器和指令网格。我可能拥有的不止这些,但这是我可能拥有的一个很好的例子。请记住,视图可以包含 X 个组件,您从一开始就不知道其中会包含什么。
现在,假设每次我选择左侧树中的节点时,我希望能够告诉其他控制器 nodeSelectedChange 事件发生了。我不想为它们中的每一个注入一个保存该信息的服务,所以我想到了拥有一个页面管理器控制器之类的东西,它是所有视图的父亲。我页面内的所有控制器/指令只能通过 PageManagerController 相互通信,他是页面中唯一知道他在其中拥有什么的东西。
这里要记住的重要一点:树不知道页面有图表或网格,它们不需要相互了解就可以进行交流。页面管理器什么都知道,现在我想让它发挥作用——它应该有服务吗?其他组件是否应该有服务并且服务可以与PageManager服务对话?
帮助我思考。希望我能把所有的点联系起来,创造一种更好的沟通方式。 我认为 sharedService 方式适用于小型应用程序,当您从一开始就知道应用程序中发生了什么,但大多数时候 - 您只是不知道谁以及何时使用您的指令,它应该能够与大家交谈。
我不喜欢活动的地方:
- 在控制器内部触发的事件,而它应该在服务内部。
- 监听器控制器也应该知道他要监听的事件的名称。如果我将事件名称更改为 $emit 或 $broadcast,我需要遍历所有应用程序中的所有侦听器 $on("eventName") 并更改为该唯一名称。
- 指令就像一个黑匣子,我不想每次都检查它的内部并找到他正在广播的事件的名称以便与之通信。
我需要一种方法将事件 NAMES 从指令中暴露出来,可能使用连接到该控制器的服务。
【问题讨论】:
标签: angularjs angularjs-directive angularjs-scope angular-ui