这个问题似乎太模糊了,但是我想不出一种更好的方式来描述这个想法,因此我将尝试详细解释它。

我将MasterController附加到我的SPA应用程序的<html>标记中。该MasterController包含用于控制以下UI元素的所有逻辑和模型:


页面标题(<title>标记)
子标题,用于显示当前页面的标题(例如“客户”,“订单”,“设置”等)
当前登录用户的名称
一些常用的操作按钮,这些按钮将用于系统中的所有页面。具体来说,这些按钮是Show filtersExport data to ExcelAdd new record


虽然可以通过检测当前ui路由器状态(通过其$stateChangeSuccess事件)来管理此列表中的前两项,但是后两项(用户名和按钮)尤其是按钮有些问题。

我可以使用$broadcast管理按钮动作,因此可以向每个控制器通知任何按钮的单击。但是这里最棘手的部分是,可能需要按不同的组合来使用按钮-一页可能需要全部,而另一页可能不需要。

假设ui-router加载了一些CustomerController。那时MasterController接收$stateChangeSuccess事件,默认情况下隐藏所有按钮。

但是现在,CustomersController如何告诉MasterController,CustomersController从一开始就需要两个特定的按钮?

从理论上讲,我可以使用CustomersController中的$emit将事件发送到MasterController,但感觉有点难看。事件是针对事件的,而不是用于发送请求的,例如“嘿,MasterController,如果您在示波器的某个位置,请显示以下按钮?”。

当然,我可能是错的,也许可以使用某种方式使用Angular事件系统以干净的方式管理此方案。

我想到的是,也许在$stateChangeSuccess事件中,我可以以某种方式检测到我的按钮单击事件当前是否存在任何侦听器,然后我可以隐藏没有附加任何侦听器的按钮,但是我不确定如何要做到这一点,我不确定它是否会按预期工作-当ui-router用另一个控制器重新创建视图时,是否会分离旧的侦听器。

最佳答案

如果您只是嵌套控制器,则它们的相应作用域实际上是利用原型继承。因此,您只需在MasterController中定义一个函数$scope.configureButtons,然后从嵌套的CustomerController中的$scope调用此函数。

如果没有嵌套控制器,则可能需要使用$rootScope.$broadcast来设置按钮。

10-08 13:48