如何从$ rootScope调用函数

时间:2017-07-27 15:03:14

标签: angularjs

我需要在bootstrap模态的隐藏事件上调用Angular函数。

这是我的隐藏事件处理程序:

    $('#modalAddAction').on('hidden.bs.modal',
        function (e) {
            console.log("in hidden.bs.modal");
            var $rootScope = angular.element(document.querySelector("[ng-controller=actionsController]")).scope();
            if ($rootScope) {
                $rootScope.$apply(function () {
                    $rootScope.initializeAt1();
                });
            }
        });

这是我需要调用的控制器中定义的函数:

       $scope.initializeAt1 = function () {
            $scope.data.addAction.actionTypeId; // initialized in $scope.getActionTypes
            $scope.data.addAction.actionStatus = 1;
            // initializers help set drop downs to appropriate selection.
            $scope.data.addAction.actionType1.actionRecommendedByLerId = 0;
            $scope.data.addAction.actionType1.actionsRecommendedByLer = [];
            $scope.data.addAction.actionType1.actionProposedBySupervisorId = 0;
            $scope.data.addAction.actionType1.actionTakenBySupervisorId = 0;
            $scope.data.addAction.actionType1.actionChargeId = 0; // formerly initialized in $scope.getActionCharges
            $scope.data.addAction.actionType1.actionCharges = [];
        }();

因此,第一次运行控制器工厂时,initializeAt1函数调用自身并进行我需要的初始化。

然后,每当隐藏模态时,我都会尝试再次调用initializeAt1,无论是从保存按钮,取消按钮还是只是单击屏幕。

#modalAddAction - 隐藏事件在这里给出了这个错误:

[$rootScope:inprog] $digest already in progress

所以现在我尝试将事件处理程序改为此(注释掉apply并直接从$ rootScope调用该函数):

    $('#modalAddAction').on('hidden.bs.modal',
        function (e) {
            console.log("in hidden.bs.modal");
            var $rootScope = angular.element(document.querySelector("[ng-controller=actionsController]")).scope();
            //if ($rootScope) {
                //$rootScope.$apply(function () {
                    $rootScope.initializeAt1();
                //});
            //}
        });

现在我收到了这个错误。

$rootScope.initializeAt1 is not a function

所以我有rootScope,但为什么看不到这个函数?

1 个答案:

答案 0 :(得分:0)

我明白了。 它只是不喜欢定义后自我调用的函数。 当我检查$ rootScope的$ scope时,initailizeAt1被列为未定义。

不得不把()带到最后。

添加电话:

        $scope.initializeActions = function () {
            $scope.initializeAt1();
        }
        $scope.initializeActions();

最后。

然后将为At2,At3等添加init以初始化动作。