2013-10-31 13 views
6

Zaimplementowałem dyrektywę modalną i ustawię tło opcji $modal.open na false. Jednak teraz mogę uruchomić wiele modów, aby otworzyć. Czy istnieje sposób, aby zapobiec uruchomieniu przycisku wyzwalania, gdy jeden modał jest otwarty?Angular UI Bootstrap Modal - jak zapobiegać otwieraniu wielu modów?

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()); 
     }); 
    }; 
}; 

Dzięki

+2

wyłączyć przycisk po uruchomieniu modemu –

Odpowiedz

12

Użyj logiczną flagę, aby tego uniknąć:

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

Czy możesz wyjaśnić, jak to działa? Widzę '' 'var opened = false;' '', po którym następuje '' 'if (opened) return;' '' Nie widzę, jak to rozwiązuje cokolwiek, nawet jeśli masz 2 upvotes na nim. Czy '' 'var opened = false''' znajduje się poza funkcją' '' $ scope.open'''' – boatcoder

+1

Masz rację. 'var opened = false;' było niewłaściwym miejscem. Właśnie to poprawiłem. Dziękuję Ci. –

+0

Dzięki człowieku, zadziałało – maverickosama92

0

Zrobiłem prosty dyrektywę, która wykorzystuje tę samą technikę jak w odpowiedzi J. Bruni.

/** 
* 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; 
       }); 
      }); 
     } 
    }; 
}); 

Aby przełączyć swój kod dla tej dyrektywy wystarczy zmienić „ng kliknij” do „open-single-modalne”, a funkcja opalane NG-click musi powrócić modalne instancji.

Przykład. Przed:

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

Po:

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

i

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

J Bruni jest bardzo dobra, ale zamiast korzystać z dodatkowej zmiennej, wykorzystać to, co już masz z modalInstance. Ponieważ deklarujesz modalną instancję wyżej, zyskujesz także elastyczność, aby użyć tej zmiennej w innym miejscu (np. Kiedy możesz odrzucić okno dialogowe).

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; 
      }); 
     }); 
    } 
Powiązane problemy