3

我在推理组件通信时遇到问题。我试图推理并失败的主要问题:我应该使用什么 - $watch$on ($broadcast/$emit) 来建立组件之间的通信?

我看到三个基本案例:

  1. 控制器+指令。他们使用 $scope 双向绑定自然地进行通信。我只是使用一些对象()将封装了一些共享状态的服务放在 $scope 中$scope.filter = {}。这种方法对我来说似乎很合理。

  2. 控制器 + 控制器。我使用 DI 注入具有封装状态的单例服务以在控制器之间进行通信。这些服务受限于使用先前方法的指令。这给了我开箱即用的数据绑定。

  3. 指令+指令。这是我推理的盲点。我有指令,驻留在不同的范围内,在同一范围内等。我有必须反映所有更改的指令(考虑滑块+图表)和必须触发 http 请求的指令(考虑选择输入)。

所以,问题是:

  1. 我应该使用什么 - $watch$on ($broadcast/$emit) 来建立组件之间的通信?
  2. 我应该倾向于在指令到指令的通信中使用$watch吗?
  3. 或者我应该倾向于在指令到指令的情况下使用$broadcast吗?
  4. 使用injection+bindinginjection+events共享状态更好吗?
4

1 回答 1

1

我认为这取决于您的指令/组件的用例。如果您希望能够重用组件而不必修改组件所在的范围,那么使用广播/发射/开启会更有意义。IMO 如果一个组件内部有一些我希望能够检索和做不同事情的信息,那么广播/发射/开启方案是最有意义的。

另一方面,如果我需要触发一些服务调用以响应指令中的某些内容,或者我想在几个视图之间共享状态,我最终会使用服务。

如评论中所述,存在的另一种替代方法是在指令定义对象中使用 require 属性:

require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent']

require - 需要另一个指令并将其控制器作为第四个参数注入链接函数。require 需要传入指令的字符串名称(或字符串数​​组)。如果使用数组,则注入的参数将是相应顺序的数组。如果找不到这样的指令或者该指令没有控制器,则会引发错误。该名称可以带有前缀:

  • (无前缀) - 在当前元素上找到所需的控制器。
  • ? - 尝试定位所需的控制器,如果找不到则返回 null。
  • ^ - 通过搜索元素的父元素找到所需的控制器。
  • ?^ - 尝试通过搜索元素的父元素来定位所需的控制器,如果未找到则返回 null。

这在您创建“复合组件”的情况下很有用,其中多个指令比尝试将所有功能封装到一个指令更有意义,但是您仍然需要在“主/包装指令”和它之间进行一些通信兄弟姐妹/孩子。

我知道这不是一个明确的答案,但我不确定是否有答案。如果我遗漏了一些要点,请打开编辑/评论以进行修改。

于 2013-10-18T22:12:40.987 回答