2013-10-31 75 views
6

我已经实现了模态指令,并将$modal.open选项背景设置为false。不过,现在我可以触发多种模式打开。有一种方法可以防止触发按钮在一个模式打开后触发吗?Angular UI Bootstrap Modal - 如何防止多个模式打开

var accountSummaryCtrl = function ($scope, $modal, $log) { 

    $scope.open = function() { 

     var modalInstance = $modal.open({ 
      templateUrl: '/Apps/generic/modal/Templates/AccountSummary.html', 
      controller: ModalInstanceCtrl, 
      backdrop: false 
     }); 

     modalInstance.result.then(function (selectedItem) { 
      $scope.selected = selectedItem; 
     }, function() { 
      $log.info('Modal dismissed at: ' + new Date()); 
     }); 
    }; 
}; 

感谢

+2

当您打开模式时禁用按钮 –

回答

12

使用布尔标志,以避免它:

var accountSummaryCtrl = function ($scope, $modal, $log) { 

    var opened = false; 

    $scope.open = function() { 

     if (opened) return; 

     var modalInstance = $modal.open({ 
      templateUrl: '/Apps/generic/modal/Templates/AccountSummary.html', 
      controller: ModalInstanceCtrl, 
      backdrop: false 
     }); 

     opened = true; 

     modalInstance.result.then(function (selectedItem) { 
      $scope.selected = selectedItem; 
      opened = false; 
     }, function() { 
      $log.info('Modal dismissed at: ' + new Date()); 
      opened = false; 
     }); 
    }; 
}; 
+0

您能否解释这是如何工作的?我看到'''var open = false;'''后面跟'''如果(打开)返回;'''我不明白这是如何解决任何事情的,即使你确实有2个upvotes。 '''var open = false''是否属于$''scope.open'''函数的外部 – boatcoder

+1

您是对的。 'var opened = false;'是错误的地方。我只是纠正它。谢谢。 –

+0

谢谢你,它工作 – maverickosama92

0

我做了一个简单的指令,它使用相同的技术,在J.布吕尼的回答。

/** 
* Directive which helps to prevent multiple modals opened when clicking same button many times. 
* 
* Just replace "ng-click" with "open-single-modal" in your html. Example: 
* 
* <button open-single-modal="openModal()">Open Window</button> 
* 
* NOTICE! "openModal()" function must return modalInstance which is a result of "$uibModal.open()" 
*/ 
app.directive('openSingleModal', function() { 
    return { 
     restrict: 'A', 
     link: function(scope, element, attrs) { 
      var opened = false; 

      element.bind('click', function() { 
       if(opened) { 
        return; 
       } 

       opened = true; 
       var modalInstance = scope.$eval(attrs.openSingleModal); 

       if(!modalInstance || !modalInstance.result || typeof modalInstance.result.then !== 'function') { 
        console.error('Incorrect modal instance returned from the open modal function', element, modalInstance); 
        return; 
       } 

       modalInstance.result.then(function() { 
        opened = false; 
       }, function() { 
        opened = false; 
       }); 
      }); 
     } 
    }; 
}); 

要切换代码这个指令只是改变“NG单击”通过NG-点击炒鱿鱼“开单模式”和函数必须返回模式实例。

例子。之前:

<a ng-click="openModal()">Open Me!</a>

后:

<a open-single-modal="openModal()">Open Me!</a>

$scope.openModal = function() { 
    return $uibModal.open(...); 
}; 
0

Ĵ布吕尼的回答是非常好的,但,而不是使用一个额外的变量,使用你已经拥有与modalInstance。由于您将模态实例声明得更高,因此您还可以灵活地在其他地方使用该变量(例如,当您想要关闭对话框时)。

link: function(scope, element, attrs) { 
     var modalInstance;  /*assign to undefined if you like to be explicit*/ 

     element.bind('click', function() { 
      if(modalInstance) { 
       return; 
      } 

      modalInstance = scope.$eval(attrs.openSingleModal); 

      if(!modalInstance || !modalInstance.result || typeof modalInstance.result.then !== 'function') { 
       console.error('Incorrect modal instance returned from the open modal function', element, modalInstance); 
       return; 
      } 

      modalInstance.result.then(function() { 
       modalInstance = undefined; 
      }, function() { 
       modalInstance = undefined; 
      }); 
     }); 
    }