为什么rootScope.on在我的应用程序中多次调用?

时间:2017-11-21 14:51:46

标签: angularjs angularjs-scope bootstrap-modal angularjs-factory angularjs-rootscope

在我的AngularJS应用程序中,我有一个控制器-A和一个工厂。我在工厂中使用以下代码来调用controller-A中的函数。在初始调用中,控制器A的功能执行1次;在下一次调用时,控制器-A的功能执行2次。因此,每次呼叫的执行次数都会增加。有可能避免这种情况,请告诉我。我在下面添加了工厂代码和控制器代码:

工厂代码:

 updateUserData: function (value, action) {
    $("#myModalInsertUser").modal('hide');
    var id = value.Id;
    var params = {};
    params.id = depotId;
    $rootScope.selectedId = params;
    $rootScope.$emit("EVENT_1", {id});
});

控制器 - 代码:

var listener = $rootScope.$on("EVENT_1", function(event, params, reload) {
    $scope.confirmUserInfo(params);
});

$scope.confirmUserInfo = function(params) {
    $('#myModalConfirmUser').modal('show');

    $('#closeConfirmUser').unbind('click').click(function () {
         $('#myModalConfirmUser').modal('hide');
         var params = $rootScope.selectedId;
         $scope.getUsers(params);
         $scope.$on('$destroy', listener);
     });
}

1 个答案:

答案 0 :(得分:1)

将事件监听器附加到$scope,当范围被销毁时,它将自动销毁:

̶v̶a̶r̶ ̶l̶i̶s̶t̶e̶n̶e̶r̶ ̶=̶ ̶$̶r̶o̶o̶t̶S̶c̶o̶p̶e̶.̶$̶o̶n̶(̶"̶E̶V̶E̶N̶T̶_̶1̶"̶,̶ ̶f̶u̶n̶c̶t̶i̶o̶n̶(̶e̶v̶e̶n̶t̶,̶ ̶p̶a̶r̶a̶m̶s̶,̶ ̶r̶e̶l̶o̶a̶d̶)̶ ̶{̶ 
var deregisterFn = $scope.$on("EVENT_1", function(event, params, reload) {
    $scope.confirmUserInfo(params);
});

$scope.confirmUserInfo = function(params) {
    $('#myModalConfirmUser').modal('show');

    $('#closeConfirmUser').unbind('click').click(function () {
         $('#myModalConfirmUser').modal('hide');
         var params = $rootScope.selectedId;
         $scope.getUsers(params);
         ̶$̶s̶c̶o̶p̶e̶.̶$̶o̶n̶(̶'̶$̶d̶e̶s̶t̶r̶o̶y̶'̶,̶ ̶l̶i̶s̶t̶e̶n̶e̶r̶)̶;̶
     });
}

建议的做法是从$rootScope广播活动,并在对此活动感兴趣的$scope接收活动。

  

是否有可能在范围被破坏之前销毁侦听器?

要删除侦听器,只需调用取消注册函数:

deregisterFn();