3

我正在寻找关于何时以及为什么要在指令定义中使用“require”选项的指导原则,为什么不使用范围进行通信 - 就像大多数时间一样在Angular中? 它是如何突然出现在指令中,我要求控制器本身,而不是仅仅将事情附加到作用域?AngularJS中的指令(和其他部分)之间的通信

一般而言 - 有许多方式角指令/控制器/示波器之间的通信 -

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

虽然我理解他们是如何在技术上工作的,但我不清楚哪些指导原则决定使用哪一个以及为什么。

对于一些通用/高级别准则会很高兴。谢谢。即,要创建具有指导自己的表单控件 -

回答

2

require如果你想创建custom form controls(请参阅从控制部分实现自定义)特别有用。您可以通过requirengModelController通过API /函数访问大量现有的功能。

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

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

+0

谢谢马克,我还会读其他你讨论过的指导。 “由于这些组件/指令都创建了隔离范围,所以范围继承不是一种选择。”即使在隔离范围内,我们可以使用'@'或'='并获得一些继承,我猜这个问题仍然是继承与范围链中较高的选项卡/窗格冲突?或者我把它全部弄错了? – Daniel 2013-05-09 17:31:52

+0

@Daniel,true,'@'或者'='可以被使用,但是这需要'pane'指​​令通过HTML传递属性 - 也就是说,需要为每个指定'addPane()'方法使用窗格:''。所以在这里使用'require'似乎是一个更清洁的方法。 – 2013-05-09 18:35:24

相关问题