您应该知道的一件事是 $ 前缀指的是 Angular 方法,$$ 前缀指的是您应该避免使用的 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 与 $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)。对于广播名称,我们想给它一个唯一的名称,这样我们就可以在我们的 secondCtrl 中捕获该名称。我选择了BOOM!纯娱乐。第二个参数“参数”允许我们将值传递给监听器。
接收我们的广播
在我们的第二个控制器中,我们需要设置代码来收听我们的广播
app.controller('SecondCtrl', function($scope){
$scope.$on('BOOM!', function(events, args){
console.log(args);
$scope.name = args; //now we've registered!
})
});
真的就是这么简单。现场示例
实现类似结果的其他方法
尽量避免使用这套方法,因为它既不高效也不易于维护,但它是解决您可能遇到的问题的简单方法。
您通常可以通过使用服务或简化控制器来做同样的事情。我们不会详细讨论这个问题,但我想我只是为了完整性而提到它。
最后,请记住一个非常有用的广播是“$destroy”,您可以再次看到 $ 表示它是由供应商代码创建的方法或对象。无论如何,当控制器被销毁时会广播 $destroy,您可能想听听这个以了解您的控制器何时被移除。