有一件事你应该知道,$ prefix指的是一个Angular方法,$$ prefixes指的是你应该避免使用的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在控制器被销毁时被广播,你可能想要听这个来知道你的控制器什么时候被删除。