javascript - 如何正确地与另一个 Controller 管理的 View 交互?

标签 javascript angularjs events view controller

这个问题可能看起来太模糊,但我想不出更好的方法来描述这个想法,所以我会尝试详细解释它。

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

  • 页面标题(<title> 标签)
  • 显示当前页面标题的子标题(如客户、订单、设置等)
  • 当前登录用户的名称
  • 一些常用的操作按钮,将用于系统中的所有页面。具体来说,这些按钮是 Show filters , Export data to ExcelAdd 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/

相关文章:

javascript - 通过两个标签小部件作为下拉菜单在博客平台中搜索

javascript - Server Boost Tracker 机器人 Discord

javascript - AngularJS:更改 HTML 字符串的编码

javascript - angularJs ng-禁用不工作

vba - 以编程方式向项目添加事件处理程序

javascript - 如何在 Redux 中不使用 .toYS() 的情况下将 Immutable js 数据结构转换为用例数组?

javascript - 单击按钮时将 div 变灰

javascript - 模型更改时angularjs图像src更改

JavaFX 事件处理之谜 - 代码被删除但事件仍然被处理?

javascript - 如何为 NodeJS 中的事件扩展对象文字对象?