2016-08-09 21 views
1

Ich habe einen $stateChangeStart Ereignisauslöser, wann immer Benutzer zwischen den Vorlagen navigieren, so in unten Code, wenn Benutzer einen Zustand ändern ich , die wie erwartet funktioniert, aber wenn ich zurück auf diese Seite seine werfen eine Ausnahme und ich verliere Socket. io Verbindung, weil Wert immer noch da ist, die if-Anweisung ausführt. Wie kann ich $ scope Wert in diesem Fall zerstören?

ctrl.js

angular.module('loggingApp').controller('DitCtrl', function($scope, $rootScope, DitFactory, FileSaver, Blob, socket, $uibModal, searchFactory) { 
    'use strict'; 
    $scope.event = []; 
    $scope.disabledRecBtn = false; 
    $scope.disabledStopBtn = true; 
    $scope.showMessage = false; 
    var totalCurrentBytes = []; 
    $scope.curVal = 4000; 
    $scope.maxVal = 37737; 

    //ENDS HERE 
    var sendMessageFlag = false; 
    // Delete File method 
    function deleteFile(filename) { 
     DitFactory.getFile(filename).then(function(response, $window) { 
      console.log('data for download', response); 
      var data = JSON.stringify(response.data); 
      var blob = new Blob([data], { 
       type: 'text/plain;charset=utf-8' 
      }); 
      FileSaver.saveAs(blob, 'server.log'); 
      socket.emit('stopRecording', $scope.filename); 
     }); 
    } 
    socket.on('ditConsumer', function(data) { 
     var obj = { 
      file: $scope.filename, 
      data: data 
     } 
     $scope.event.push(data); 
     jsonToArray(); 
     socket.emit('messageToFile', obj); 
     if (sendMessageFlag === true) { 
      return sendMessageToFile(obj); 
     } 
    }); 

    function sendMessageToFile(data) { 
     if (data.file) { 
      socket.emit('startrecording', data); 
      $scope.disabledRecBtn = true; 
      $scope.disabledStopBtn = false; 
      $scope.showMessage = true; 
     } 
    } 
    $scope.stopLogs = function() { 
     sendMessageFlag = false; 
     $scope.modalInstance = $uibModal.open({ 
      templateUrl: '/web/global/modal.html', 
      controller: 'ModalController' 
     }); 
    }; 
    $rootScope.$on('downloadFile', function(s, data) { 
     deleteFile($scope.filename); 
     $scope.disabledRecBtn = false; 
     $scope.disabledStopBtn = true; 
     $scope.showMessage = false; 
    }); 
    $rootScope.$on('onCancelDelete', function() { 
     if ($scope.filename) { 
      console.log('oncanceldelete function'); 
      socket.emit('stopRecording', $scope.filename); 
      $scope.disabledRecBtn = false; 
      $scope.disabledStopBtn = true; 
      $scope.showMessage = false; 
     } 
    }); 
    $scope.recordLogs = function() { 
     socket.emit('createlogfile'); 
     socket.on('filename', function(filename) { 
      console.log('filename from sever', filename); 
      $scope.filename = filename; 
      sendMessageFlag = true; 
      $scope.disabledRecBtn = true; 
      $scope.disabledStopBtn = false; 
      $scope.showMessage = true; 
     }); 
    } 

    //Search logs code here 
    $scope.searchLogs = function() { 
     $scope.modalInstance = $uibModal.open({ 
      templateUrl: '/view/modals/searchModal.html', 
      controller: 'SearchController' 
     }); 
     searchFactory.setDitLogs($scope.event); 
    } 
    $scope.serverFiles = function() { 
     $scope.modalInstance = $uibModal.open({ 
      templateUrl: '/view/modals/serverModal.html', 
      controller: 'ServerFilesCtrl' 
     }) 
    } 

     $rootScope.$on('$stateChangeStart', 
      function(event, toState, toParams, fromState, fromParams){ 
       if($scope.filename) { 
        console.log($scope.filename); 
        console.log('STATE CHANGED'); 
        console.log('destroy on close'); 
        socket.emit('stopRecording', $scope.filename); 
        sendMessageFlag = false; 
        $scope.filename = null; 
       } 
      }) 
}); 
+0

'$ scope.filename = null'? – mic4ael

+0

wo definieren Sie den '$ rootScope. $ On ('$ stateChangeStart)' Callback? –

+0

Ich habe Callback nirgends definiert – hussain

Antwort

0

Alle Bereiche zerstört werden, wenn ein Routing durchgeführt wird. Das ist die Funktion, die der UI-Router bietet. Wenn Sie es für einen bestimmten Zweck manuell angeben möchten, können Sie immer $ scope. $ Destroy für bestimmte Controller verwenden.

+0

Wenn ich den Status ändern und zurück zum vorherigen gehen, sehe ich noch '$ scope.filename' Wert Ich benutze Ui-Router, Wie Sie erwähnt, kommt Ui-Router mit dieser Funktion dann warum immer noch sehen Wert ? – hussain

+0

Wenn Sie den Listener zum $ rootScope hinzufügen und wenn Sie von einem Controller weg navigieren, bleibt der Listener bestehen und triggert weiter. Daher müssen Sie manuell zerstören. Möglicherweise möchten Sie den gesamten Code freigeben, der an den Controller geschnappt wurde, um besser zu helfen. – Jayesh

+0

Ich habe meinen Controller hinzugefügt, siehe aktualisierte Frage – hussain

0

wenn ich wieder alle Methoden zum Zustand sind Aufrufe zweimal z.B $scope.recordLogsconsole.log('filename from sever', filename);

Das Druck console.log Teil der Handler-Funktion ist, das den Dienst socket gegeben wurde. Auch wenn $scope zerstört wurde, wurde die socket.on Handler-Funktion vom socket-Dienst gespeichert.

$scope.recordLogs = function() { 
     socket.emit('createlogfile'); 
     //PROBLEM 
     //event handler function retained by socket service 
     socket.on('filename', function(filename) { 
      console.log('filename from sever', filename); 
      $scope.filename = filename; 
      sendMessageFlag = true; 
      $scope.disabledRecBtn = true; 
      $scope.disabledStopBtn = false; 
      $scope.showMessage = true; 
     }); 
    } 

Um Ereignishandler Duplizieren zu vermeiden, wenn ein Benutzer hin und her navigiert zwischen Routen socket.forward verwenden:

angular.module('myMod', ['btford.socket-io']). 
    controller('MyCtrl', function ($scope, socket) { 
    socket.forward('someEvent', $scope); 
    $scope.$on('socket:someEvent', function (ev, data) { 
     $scope.theData = data; 
    }); 
    }); 

von socket.forward Verwendung der socket Service den Handler abzumelden, wenn die $scope zerstört wird.

Weitere Informationen finden Sie angular-socket-io API Reference - socket.forward

Verwandte Themen