2013-11-15 24 views
7

Ich rufe einen Bootstrap-Modaldialog über einen Link auf.AngularUI Bootstrap Modal Offenes Ereignis

Ich möchte einen Timer im Winkelregler starten, wenn der Dialog erscheint. Wie kann ich das Öffnen des Dialogs im Winkelregler erkennen, um den Timer zu starten?

Wenn ich Timer im Umfang wie diese zu starten,

app.controller('myctrl', 
    ['$scope', '$window', '$timeout', 'svc', 
    function ($scope, $window, $timeout, svc) { 

     $scope.countdown = 10; 

     $scope.runCounter = function() { 
      $scope.countdown -= 1; 
      if ($scope.countdown > 0) 
       $timeout($scope.runCounter, 60000); 
     } 
     $scope.runCounter(); 
    }]); 

der Timer startet, wenn die Anwendung gestartet wird. Ich möchte, dass der Timer erst startet, wenn der Dialog geöffnet wird. Danke.

Antwort

-2
alert($('#myModal').hasClass('in')); 

Es gibt true zurück, wenn modal geöffnet ist. Sie können prüfen, ob Modal-Fenster geöffnet ist oder nicht, dann kann u Ihr Countdown Ereignis starten ..

+2

das wird funktionieren, aber die Antwort von @Nikos ist viel besser. – Michael

+2

Verwenden Sie den jquery-Selektor nicht in eckigen Apps. Es tötet die ganze Idee, Daten unabhängig von DOM zu halten. – Subash

72

Überprüfen Sie this aus.

var modalInstance = $modal.open({...}); 
modalInstance.opened.then(function() { 
    alert("OPENED!"); 
}); 

Die $modal.open() gibt ein Objekt, das neben anderen Eigenschaften enthält die opened Versprechen, um wie oben verwendet werden.

+6

Dies ist die richtige Antwort, sollte die akzeptierte Antwort sein. Ashish's Antwort oben ist wirklich mehr ein Hack –

+0

Was ist, wenn es nicht geöffnet ist? Es wird 'TypeError geben: Kann die Eigenschaft' opened 'von undefined' nicht lesen? Hast du eine Lösung dafür? – Sampath

+1

Wenn es eine Chance gibt, dass das Modal nicht geöffnet wird, fügen Sie einfach ein 'if (modalInstance)' vor der Zeile hinzu. –

4

Ich nehme an, dass Sie Modale von http://angular-ui.github.io/bootstrap/ verwenden.

Wenn Sie genau hinsehen, werden Sie sehen, dass die Komponente ein Versprechen offen legt, das aufgelöst wird, wenn das Dialogfeld geöffnet wird. Welches ist es, was du benutzen musst? Sie können in der Steuerung so etwas tun, wo die modale erstellt:

$scope.runCounter = function() { 
    $scope.countdown -= 1; 
    if ($scope.countdown > 0) 
    $timeout($scope.runCounter, 60000); 
} 

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

//Add a function for when the dialog is opened 
modalInstance.opened.then(function() { 
    $scope.runCounter 
}); 

Siehe Plunker Arbeits here

+0

Das gleiche versucht. Aber $ modal öffnet den Dialog nicht. Ist es nicht möglich, $ modal von einem eckigen Service aus aufzurufen? $ modal.open ({ Vorlage: "

{{Countdown}}

", Controller: 'Myctrl' }); Controller wird instanziiert, aber Dialog wird nicht geöffnet. – user2793135

0

var modalInstance = $modal.open({ 
 
       templateUrl: '../augustine_app/templates/program_purchase_popup.html', 
 
       backdrop: 'static', 
 
       controller: function ($scope, $modalInstance) { 
 
        $scope.cancel = function() { 
 
         $modalInstance.dismiss('cancel'); 
 
        }; 
 
       } 
 
      }); 
 

 
      
 

 
      if (navigator.userAgent.match(/iPhone|iPad|iPod/i)) { 
 
       modalInstance.opened.then(function() { 
 
        var modal; 
 
        var getModalInterval = function() { 
 
         modal = document.getElementsByClassName('modal')[0]; 
 
         if (modal) { 
 
          clearInterval(getModal); 
 
          modal.style.marginTop = window.screenTop + 'px'; 
 
          modal.style.height = 'auto'; 
 
          modal.style.position = 'absolute'; 
 
          modal.style.overflow = 'visible'; 
 
         } 
 
        }; 
 
        modal = document.getElementsByClassName('modal')[0]; 
 
        if (!modal) { 
 
         var getModal = setInterval(getModalInterval, 2000); 
 
        } 
 
       }); 
 
      } 
 
     };

Unfortunatly die open.then (func) läuft, bevor der freaking modal tatsächlich in der DOM ist . Daher der setInterval.

hier ist einige nicht jQuery Winkelcode.