系统关闭后仍在调用$modal控制器的作用域函数。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了系统关闭后仍在调用$modal控制器的作用域函数。相关的知识,希望对你有一定的参考价值。

我正在做一个AngularJS项目。请记住,这是Angularjs的第1版。在这个项目中,我有一个控制器,它与一个html页面相关联。在这个控制器中,我定义了一个$rootScope的函数。

现在,在这个页面上,我还使用了一个弹出框。我使用$modal组件来显示这个弹出框。这个模态弹出框也被附加在一个控制器上,这个控制器也用$rootScope定义了同样的函数。

下面是我的简单代码。

angular.module('myapp').controller('pageCtrl', function($rootScope, $modal){

      $rootScope.getRecords = function() {
        //Do some action
      }
      
      $rootScope.openModal = function(){
          var modalInstance = $modal.open({
            templateUrl: 'modal.html',
            controller: modalCtrl
          });
          
          modalInstance.result.then(function(result){}, function(cancel){});
      }
    });
    
    angular.module('myapp').controller('modalCtrl', function($rootScope, $modal){

      $rootScope.getRecords = function() {
        //Do some action
      }
      
      $rootScope.closeModal = function(){
          $modalInstance.dismiss('cancel');
      }
    });
    
    
    
<!-- Page Html -->
<div class="" ng-controller="pageCtrl">
 <button class="btn" ng-click="openModal()">Open Modal</button>
 <button class="btn" ng-click="getRecords()">Get Record</button>
</div>

<!-- modal.html -->
<div class="">
    <p>You are in Modal Box</p>
    <button class="btn" ng-click="closeModal()">Close Modal</button>
</div>

你可以看到我的代码中,我在页面控制器和模态控制器中定义了相同的功能。当我在调用模态之前点击 "获取记录 "按钮时,系统调用的是页面控制器中定义的函数,这很正常。但当我打开模态后关闭,再点击 "获取记录 "按钮后,系统调用的是模态控制器中定义的功能,而不是页面控制器。

我不明白,为什么在打开模态框后,系统会调用模态控制器的功能。谁能帮我解决这个问题。

答案

我相信你使用的是 AngularJS的Bootstrap 1

为什么会调用内部方法 getRecords() - 因为你重新定义了它。

做。

$rootScope.getRecords = function() {
    alert("external 1");
}

$rootScope.getRecords = function() {
    alert("external 2");
}

而在调用它之后,你得到 "external 2".


我不知道你为什么用 $rootScope 里面 $modal 但这不是好的做法。

如果你想调用外部 getRecords,你可以写。

方案一

$scope.getRecords = function() {
   alert("external");
}

var modalInstance = $modal.open({
  templateUrl: 'modal.html',
  controller: modalCtrl,
  resolve: {
    callback: function () {
      return $scope.getRecords
    }
  }
});

和你的模式。

angular.module('myapp').
controller('modalCtrl', function($scope, $modalInstance, callback){

  $scope.getRecords = function() {
    callback();
   }
  
  $rootScope.closeModal = function(){
      $modalInstance.dismiss('cancel');
  }
});

例子:


备选方案2

另一种方法是用同样的 $scope 对于 $modal:

 var modalInstance = $modal.open({
   templateUrl: 'myModalContent.html',
   controller: 'ModalInstanceCtrl',
   scope: $scope
 });

例2


以上是关于系统关闭后仍在调用$modal控制器的作用域函数。的主要内容,如果未能解决你的问题,请参考以下文章

angularjs 弹出框 $modal 参数(转)

Qt 应用程序在关闭所有窗口后仍保留在内存中

static关键字作用

查询完成后仍在运行

从angular.js中一个接一个地从子控制器调用两个父控制器作用域函数

Angular 组件在被销毁后仍在监听订阅 [重复]