Javascript $emit,$broadcast,原型继承

Javascript $emit,$broadcast,原型继承,javascript,angularjs,Javascript,Angularjs,仍然是AngularJS的基础知识,我理解这些概念,但是,只要看看定制事件 $emit 及 对于嵌套控制器 根据文档,$emit bubbles事件,即,对于嵌套控制器,向上传递事件 我的问题是,这与仅仅从父控制器调用函数(原型继承)有什么不同。还是我没有理解什么?$emit帮助您将事件传递给父控制器 不能在所有子控制器中使用$controller('ParentController',{scope:scope})来继承属性。为了使代码干净且松散耦合,$emit将帮助您实现这一点 假设您有三

仍然是AngularJS的基础知识,我理解这些概念,但是,只要看看定制事件

$emit 

对于嵌套控制器

根据文档,$emit bubbles事件,即,对于嵌套控制器,向上传递事件


我的问题是,这与仅仅从父控制器调用函数(原型继承)有什么不同。还是我没有理解什么?

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

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

假设您有三个层次结构级别,并且希望子控制器更新特定父控制器的值。如果要通过prototype链实现这一点,则需要使用
$controller('ParentController',{scope:scope})
继承特定的控制器,但是
$emit
将避免这种情况。您不需要知道哪个父控制器。而是发出事件

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

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

问题是,你不能总是确定你的直系父母是你想打电话给的人。使用这种反模式很容易破坏代码

你必须同意这一点

$scope.$parent.$parent.$parent.doSomething(); 
它很难看

相反,您可以
$emit
向上发送事件,现在,只要父控制器正在侦听和响应,它就与链的上游多远无关

这在控制器之间提供了良好的松耦合,就像一个消息泵


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

以一个具有多个父控制器的子控制器或一个具有多个子控制器的父控制器为例。如果开发人员需要在父级中维护子级列表,以便对每个子级调用函数$emit和$broadcast是允许沿着观察者模式的线路进行松散耦合消息传递的实用程序。如果层次结构中的所有父级都需要知道子控制器已完成某些任务或需要代表其执行某些任务,则is可以只生成一个事件,感兴趣的各方可以侦听

还可以传递数据,从而无需控制器在继承的作用域上共享数据

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