Javascript 角度广播发射多次

Javascript 角度广播发射多次,javascript,angularjs,Javascript,Angularjs,我有以下html <div ng-controller = "ParentCtrl"> Parent Div <input type="button" ng-click="getNames()" value="Get Records"></button> <li ng-repeat = "name in names">{{name}}</name> <div ng-controller="Child

我有以下html

<div ng-controller = "ParentCtrl">
    Parent Div
    <input type="button" ng-click="getNames()" value="Get Records"></button>
    <li ng-repeat = "name in names">{{name}}</name>
    <div ng-controller="ChildCtrl">

    <li ng-repeat = "name in receivedNames">dsds{{name}}</name>
</div>
</div>
ChildCtrl:

demoApp.controller('ChildCtrl', function($scope)
{
    $scope.$on('UPDATE_RECORD', function (event, names)
    {
        $scope.receivedNames = names;
        alert($scope.receivedNames);
    });
});

当我单击“获取记录”按钮时,侦听器上的子控制器将被触发两次。如果名称数组有三个项,它将被激发3次。请帮助。

这是因为您在控制器中写入了事件寄存器(
UPDATE\u RECORD
)。它将被调用的次数与ng repeat被调用的次数相同

为什么

您已经在
ng repeat
中定义了子控制器,因此它将在每次迭代中执行,并且事件将被注册。因此,当您广播它时,它将执行所有已注册的事件

您应该将下面的代码移到父控制器

$scope.$on('UPDATE_RECORD', function (event, names)
{
    $scope.receivedNames = names;
    alert($scope.receivedNames);
});

这是因为您在控制器内部写入了事件寄存器(
UPDATE\u RECORD
)。它将被调用的次数与ng repeat被调用的次数相同

为什么

您已经在
ng repeat
中定义了子控制器,因此它将在每次迭代中执行,并且事件将被注册。因此,当您广播它时,它将执行所有已注册的事件

您应该将下面的代码移到父控制器

$scope.$on('UPDATE_RECORD', function (event, names)
{
    $scope.receivedNames = names;
    alert($scope.receivedNames);
});

如果名称数组有N个项目,则在更新\记录上有N个子控制器,因此有N个侦听器…如果名称数组有N个项目,则在更新\记录上有N个子控制器,因此有N个侦听器…我的坏。。。我没有关上李牌。。谢谢但是如果我把上面的代码保存在ChildCtrl里呢?我的坏。。。我没有关上李牌。。谢谢但是如果我把上面的代码保存在ChildCtrl中呢?