您应该知道的一件事是$前缀指的是Angular方法,$$前缀指的是应避免使用的角度方法。
下面是一个示例模板及其控制器,我们将探讨$ broadcast / $ on如何帮助我们实现所需的目标。
<div ng-controller="FirstCtrl">
<input ng-model="name"/>
<button ng-click="register()">Register </button>
</div>
<div ng-controller="SecondCtrl">
Registered Name: <input ng-model="name"/>
</div>
控制器是
app.controller('FirstCtrl', function($scope){
$scope.register = function(){
}
});
app.controller('SecondCtrl', function($scope){
});
我想问的是,当用户单击注册时,如何将名称传递给第二个控制器?您可能会想出多种解决方案,但是我们要使用的是使用$ broadcast和$ on。
$ broadcast vs $ emit
我们应该使用哪个?$ broadcast将引导所有子dom元素,而$ emit将引导相反的方向给所有祖先dom元素。
避免在$ emit或$ broadcast之间做出决定的最佳方法是从$ rootScope引导并对其所有子级使用$ broadcast。由于我们的dom元素是同级元素,因此这使我们的案件变得更加容易。
添加$ rootScope并让$ broadcast
app.controller('FirstCtrl', function($rootScope, $scope){
$scope.register = function(){
$rootScope.$broadcast('BOOM!', $scope.name)
}
});
请注意,我们添加了$ rootScope,现在我们正在使用$ broadcast(broadcastName,arguments)。对于broadcastName,我们想给它一个唯一的名称,以便我们可以在secondCtrl中捕获该名称。我选择了BOOM!纯娱乐。第二个参数“ arguments”使我们可以将值传递给侦听器。
接收我们的广播
在第二个控制器中,我们需要设置代码以收听广播
app.controller('SecondCtrl', function($scope){
$scope.$on('BOOM!', function(events, args){
console.log(args);
$scope.name = args; //now we've registered!
})
});
真的就是这么简单。现场例子
其他获得类似结果的方法
尝试避免使用这套方法,因为它既不高效也不易于维护,但却是解决可能遇到的问题的简单方法。
通常,您可以通过使用服务或简化控制器来执行相同的操作。我们不会对此进行详细讨论,但是我想我只是为了完整性而提到它。
最后,请记住,要收听的真正有用的广播是“ $ destroy”,您可以看到$表示它是由供应商代码创建的方法或对象。无论如何,销毁控制器时会广播$ destroy,您可能想听一下,以了解何时卸下控制器。