什么是AngularJS中的$ on()

use*_*445 56 angularjs

$rootScope.$on('abc',function(event, next, current){ });在教程中得到了这段代码.

我的问题是什么.$on()?如果它是一个函数,那为什么它先于$

Yan*_* Li 111

$on$broadcast和有关$emit- 这是一种从其他地方触发代码的方法.

关于$on你应该知道的第一件事就是它是一种方法$scope

你要知道的第二件事是$ prefix指的是Angular方法,$$前缀指的是你应该避免使用的angular方法.

现在让我们详细了解一下$on是什么.

下面是一个示例模板及其控制器,我们将探索如何$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>
Run Code Online (Sandbox Code Playgroud)

控制器是

app.controller('FirstCtrl', function($scope){
    $scope.register = function(){

    }
});

app.controller('SecondCtrl', function($scope){

});
Run Code Online (Sandbox Code Playgroud)

我的问题是,当用户点击注册时,如何将名称传递给第二个控制器?您可能会提出多种解决方案,但我们要使用的是使用$ 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)
    }
});
Run Code Online (Sandbox Code Playgroud)

注意我们添加了$ 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!
  })
});
Run Code Online (Sandbox Code Playgroud)

这真的很简单.实例

其他方法可以达到类似的效果

尽量避免使用这套方法,因为它既不高效又不易维护,但它是解决您可能遇到的问题的简单方法.

您通常可以通过使用服务或简化控制器来执行相同的操作.我们不会详细讨论这个问题,但我认为我只是提到完整性.

最后,请记住一个真正有用的广播,再次'$ destroy'可以看到$表示它是供应商代码创建的方法或对象.无论如何,当控制器被破坏时,广播会播放$ destroy,你可能想要听听它以了解何时删除你的控制器.