【发布时间】:2015-09-20 21:43:54
【问题描述】:
这个问题可能看起来太模糊了,但我想不出更好的方式来描述这个想法,所以我会尝试详细解释一下。
我将 MasterController 附加到我的 SPA 应用程序的 <html> 标签。此 MasterController 包含用于控制以下 UI 元素的所有逻辑和模型:
- 页面标题(
<title>标签) - 显示当前页面标题的子标题(如客户、订单、设置等)
- 当前登录用户名
- 一些常用的操作按钮,将用于系统中的所有页面。具体来说,这些按钮是
Show filters、Export data to Excel和Add new record。
虽然此列表中的前两项可以通过检测当前 ui-router 状态(通过其$stateChangeSuccess 事件)来管理,但后两项(用户名和按钮)有些问题,尤其是按钮。
我可以使用$broadcast 管理按钮操作,因此每个控制器都可以收到任何按钮的点击通知。但这里棘手的部分是按钮可能需要以不同的组合 - 一页可能需要所有按钮,而另一页可能不需要。
假设,ui-router 加载了一些 CustomersController。此时 MasterController 接收到$stateChangeSuccess 事件并默认隐藏所有按钮。
但是现在,CustomersController 如何告诉 MasterController CustomersController 从一开始就需要两个特定按钮?
理论上,我可以使用 CustomersController 中的$emit 向 MasterController 发送事件,但不知何故感觉很难看。事件是用于事件,而不是用于发送诸如“嘿,MasterController,如果您在范围内的某个地方,请显示以下按钮吗?”之类的请求。
当然,我可能是错的,也许有一些方法可以使用 Angular 事件系统以干净的方式管理这个场景。
我想到的是,也许在 $stateChangeSuccess 事件中,我可以以某种方式检测当前是否有任何侦听器用于我的按钮单击事件,然后我可以隐藏没有附加任何侦听器的按钮,但我不知道该怎么做,我不确定它是否会按预期工作 - 当 ui-router 使用另一个控制器重新创建视图时是否会分离旧的侦听器。
【问题讨论】:
标签: javascript angularjs events view controller