2016-05-24 3 views
0

Das Problem, das wir haben, ist, wenn wir auf das Ereignis 'ngDialog.closed' hören, fanden wir, dass es mehrfach feuert. Wir öffnen den Dialog nur einmal, also nehmen wir an, dass das gleiche Modal auch nur einmal ausgelöst werden soll. Es gibt mehrere modals über die Anwendung, und wir hören für diese spezifische modal, indem es $ rootScope Befestigung, etwa so:ngDialog geschlossen Ereignis löst mehrere Male aus (AngularJS)

  $rootScope.$on('ngDialog.closed', function (e, $dialog) { 
      console.log("CLOSED TEHE MODAL", $dialog); 
      console.log("EVENT", e); 
      if($rootScope.modalFinished && localStorage.getItem("tourComplete") !== "true"){ 
       $rootScope.modalFinished = false; 
       console.log("THIS IS LOCAL STORE:", localStorage.getItem("tourComplete")); 
        $scope.CallMe(); 
      } 
     }); 

Der Grund, warum wir über $ rootScope hören ist dieses „geschlossen“ Ereignis übergeben wird von einem Controller (das modale) zu einem anderen Controller (Startbildschirm), der bereits vor dem modalen Controller geladen wurde.

Wir haben festgestellt, dass beim Ereignis 'ngDialog.closed' mehrere Ereignisse ausgelöst werden (in der Regel bis zu 2 bis 3 Mal pro Schließen eines Modales).

Hier ist, wo wir die ngDialog (im Login-Controller) öffnen:

     $state.go('app.dashboard') 
         if(AclService.can('edit')|| AclService.can('admin')){ 

         $scope.$on('$stateChangeSuccess', function onStateSuccess(event, toState, toParams, fromState){ 

          $rootScope.modalFinished = true; 
          CauseService.get().then(function(result){ 
          var cause = result[0].attributes; 

          if(!cause.has_backlinked || !cause.has_verified_address){ 
           // $rootScope.modalFinished = true; 
           ngDialog.open({ 
           template: '../../app/views/dashboard/progress_modal.html', 
           showClose: false, 
           className: 'ngdialog-theme-default progressModal', 
           controller: 'ProgressModalController', 
           resolve:{ 
            'Cause': ['CauseService', function(CauseService){ 
            // console.log("CauseService in routes", CauseService.get()); 
            return CauseService.get(); 
            }] 
           } 
           }); 
          } 
          }); 
         }); 
         } 

Jede Hilfe wäre sehr geschätzt.

Vielen Dank.

-M-

Antwort

1

Ordnung so nach viel Versuch und Irrtum, ich festgestellt, dass aufgrund der Anbringung des ‚ngDialog.close‘ Ereignis zu $ ​​rootScope und der Controller wir hören schon vor der Steuerung modal geladen ist geladen hat, protokolliert jeder Controller das Ereignis, bei dem das Modal geschlossen wurde.

um dieses Problem zu beheben, ich angebracht, um den Anwendungsbereich ‚ngDialog.close‘ Ereignis $ in etwa so:

 $scope.$on('ngDialog.closed', function (e, $dialog) { 
     if($rootScope.modalFinished && localStorage.getItem("tourComplete") !== "true"){ 
      $rootScope.modalFinished = false; 
      console.log("THIS IS LOCAL STORE:", localStorage.getItem("tourComplete")); 
      console.log("****************NGDIALOG IS CALLED") 
      $scope.CallMe(); 
     } 
     }); 

Und nun das gewünschte Verhalten von nur ein Ereignis ‚ngDialog.close‘ wird ausgelöst, innerhalb der Dashboard-Controller. Diese Lösung löst auch das Problem, dass dieser Listener auf andere Modalitäten in anderen $ -Zuständen oder -Controllern gefeuert wird.

Hoffe, diese Antwort kann jemandem helfen und würde jede Rückmeldung zu schätzen wissen !!!!

-M-

Verwandte Themen