【问题标题】:Communication between directives (and other parts) in AngularJSAngularJS 中指令(和其他部分)之间的通信
【发布时间】:2013-05-03 18:06:40
【问题描述】:

我正在寻找关于何时以及为什么应该在指令定义中使用“require”选项的指南, 为什么不在 Angular 中大多数时候只使用 Scope 进行通信? 怎么回事,突然在指令中,我要求控制器本身,而不仅仅是将东西附加到范围?

一般来说 - Angular 中的指令/控制器/范围之间有多种通信方式 -

  • 范围继承。
  • RootScope“发射”。
  • 服务(工厂/服务/供应商)。
  • 在指令中需要控制器。
  • 在指令中要求新的范围/隔离范围/“正常”范围。
  • 更多?

虽然我了解它们在技术上是如何工作的,但我不清楚决定使用哪一个以及为什么使用的准则是什么。

会很高兴获得一些通用/高级指南。谢谢。

【问题讨论】:

    标签: javascript model-view-controller angularjs angularjs-directive


    【解决方案1】:

    require 在您想要创建 custom form controls 时特别有用(请参阅从控件实现自定义部分)——即,您想要使用指令创建自己的表单控件。您可以requirengModelController 通过其 API/函数访问许多现有功能。

    在 AngularJS 主页的创建组件部分可以找到另一个用例,其中pane 指令使用require: '^tabs' 来访问tabs 控制器。由于这两个组件/指令都创建了隔离范围,因此范围继承不是一种选择。服务也不适合,因为您的应用程序可能有多个 tabs 指令。因此,在这种情况下,控制器被用作pane 指令能够影响tabs 范围的一种手段——以便能够进入范围。如果不使用requirepane 指令将无法进入tabs 范围。我在这个 SO 答案中更详细地讨论了这个问题(用图片):'this' vs $scope in AngularJS controllers

    require 只能在感兴趣的控制器定义在同一元素上(例如,ngModelController)或存在层次结构(例如,窗格 -> 选项卡)时使用。

    【讨论】:

    • 谢谢马克,我还将阅读您指导我进行的其他讨论。 “由于这两个组件/指令都创建了隔离范围,因此范围继承不是一种选择。”即使在隔离范围内,我们也可以使用'@'或'='并获得一些继承,我想问题仍然是继承与范围链中更高的选项卡/窗格冲突?还是我都搞错了?
    • @Daniel, true, '@' or '=' 可以使用,但这需要pane 指令通过HTML 传递属性——即addPane() 方法需要为每次使用窗格指定:<pane add-pane="addPane()" ...>。所以在这里使用require 似乎是一种更清洁的方法。
    猜你喜欢
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2016-03-31
    • 2015-09-15
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多