$ emit,$ broadcast,prototypical inheritance

时间:2015-04-01 09:12:30

标签: javascript angularjs

仍然在AngularJS的基础知识上,我理解这些概念,只是看一下自定义事件,

$emit 

$broadcast 

用于嵌套控制器..

根据文档,$ emit会发生事件,即。对于嵌套控制器,将它传递给链,

我的问题是,只是简单地从父控制器调用一个函数(原型继承),这有什么不同。还是我想念一些东西?

3 个答案:

答案 0 :(得分:1)

问题是,您不能总是确定您的直接父母是您想要呼叫的父母。使用这种反模式很容易破解你的代码。

你必须同意

$scope.$parent.$parent.$parent.doSomething(); 

非常难看。

相反,你可以向上$emit一个事件,现在无论你的父控制器链是多远,只要它正在倾听并做出反应。

这为控制器之间提供了很好的松耦合,就像消息泵一样。

同样适用于$broadcast,而不是向下,而在这里我认为它更为重要。

答案 1 :(得分:0)

$emit可帮助您将事件传递给父控制器。

您不能在所有子控制器中使用$controller('ParentController', {scope: scope})来继承属性。为了使代码干净且松散耦合,$ emit将帮助您实现这一目标。

假设您有三个层次结构,并且您希望子控制器更新特定父控制器的值。如果您要通过原型链执行此操作,则需要使用$controller('ParentController', {scope: scope})继承该特定控制器,但$emit将避免这种情况。您无需知道哪个父控制器。而只是发出事件。

在要读取数据的相应父控制器中,使用

$scope.$on("eventname", function(event, data) {
   // update value here
});

答案 2 :(得分:0)

以具有许多父母的子控制器或具有许多孩子的父控制器为例。开发人员是否需要维护父级中的子级列表以在每个子级上调用函数。 $ emit和$ broadcast是允许沿Observer模式行进行松散耦合消息传递的实用程序。如果层次结构中的所有父母都需要知道子控制器已完成某项任务或需要代表其执行任务,则可以生成事件并且感兴趣的各方可以听取。

也可以传递数据,无需控制器共享继承范围内的数据。