这个问题可能看起来太模糊,但我想不出更好的方法来描述这个想法,所以我会尝试详细解释它。
我已将 MasterController 附加到 <html>
我的 SPA 应用程序的标签。该 MasterController 包含用于控制以下 UI 元素的所有逻辑和模型:
- 页面标题(
<title>
标签) - 显示当前页面标题的子标题(如客户、订单、设置等)
- 当前登录用户的名称
- 一些常用的操作按钮,将用于系统中的所有页面。具体来说,这些按钮是
Show filters
,Export data to Excel
和Add new record
.
虽然此列表中的前两项可以通过检测当前 ui-router 状态(通过其 $stateChangeSuccess
事件)来管理,但最后两项(用户名和按钮)有些问题,尤其是按钮。
我可以使用 $broadcast
管理按钮操作,因此每个 Controller 都可以收到有关单击任何按钮的通知。但这里棘手的部分是,按钮可能需要不同的组合 - 一个页面可能需要所有按钮,而另一个页面可能不需要。
比方说,ui-router 加载了一些 CustomersController。此时 MasterController 收到 $stateChangeSuccess
事件并默认隐藏所有按钮。
但是现在,CustomersController 如何告诉 MasterController CustomersController 从一开始就需要两个特定的按钮?
理论上,我可以使用$emit
从 CustomersController 向 MasterController 发送事件,但不知何故感觉很丑。事件是用于事件的,而不是用于发送诸如“嘿,MasterController,如果您在范围内的某个地方,可以显示以下按钮吗?”之类的请求。
当然,我可能是错的,也许有某种方法可以使用 Angular 事件系统以干净的方式管理这个场景。
我想到的可能是 $stateChangeSuccess
我可以以某种方式检测当前是否有任何监听器用于我的按钮单击事件,然后我可以隐藏没有附加任何监听器的按钮,但我不确定如何执行此操作,并且我不确定它是否会按预期工作 - 当 ui-router 使用另一个 Controller 重新创建 View 时,是否会分离旧的监听器。
最佳答案
如果您只是嵌套 Controller ,则它们相应的作用域实际上使用原型(prototype)继承。因此,您可以在 MasterController 中定义一个函数 $scope.configureButtons
,然后从嵌套的 CustomerController 中的 $scope
调用该函数。
如果 Controller 没有嵌套,您可能需要使用 $rootScope.$broadcast
来设置按钮。
关于javascript - 如何正确地与另一个 Controller 管理的 View 交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32684622/