2016-11-20 2 views
0

Ich habe eine einzelne Seite Admin-Anwendung mit angularjs erstellt. Die Anwendung verfügt über Kopfzeile, Fußzeile, linke Registerkarte und Inhaltsbereich. Ähnlich wie dieser Link http://keenthemes.com/preview/metronic/theme/admin_2_angularjs/index.html#/dashboard.html

Startpunkt ist main.js, die den Header Controller, Footer Controller und linken Tab Controller hat. Ich lade verschiedene Seiten innerhalb des Inhaltsbereichs basierend auf der Tab-Auswahl. Dies wird mit $ stateProvider wie unten gezeigt konfiguriert. Es gibt ungefähr 6 Registerkarten.

Inhalt der main.js

MyApp.controller('HeaderController', ['$scope', '$rootScope', '$timeout', function($scope, $rootScope, $timeout) { 
$scope.runSimulation = function(){  
     $rootScope.$broadcast('SaveAll').then(function(){ 
      //Run process on server when save all is finished on all 6 tabs 
     }); 
    } 
}]); 

MyApp.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) { 

$urlRouterProvider.otherwise("/tab1"); 
    $stateProvider 
    // Tab1 
    .state('tab1', { 
     url: "/tab1", 
     templateUrl: path + "/views/tab1.html",    
     data: {pageTitle: 'First Page'}, 
     controller: "Tab1Controller", 
     resolve: { 
      deps: ['$ocLazyLoad', function($ocLazyLoad) { 
       return $ocLazyLoad.load({ 
        name: 'MyApp', 
        insertBefore: '#ng_load_plugins_before', 
        files: [ 
          path + 'js/controllers/Tab1Controller.js', 
        ] 
       }); 
      }] 
     } 
    }) 

    // Tab2 
    .state('tab2', { 
     url: "/tab2", 
     templateUrl: path + "/views/tab2.html",    
     data: {pageTitle: 'Second Page'}, 
     controller: "Tab2Controller", 
     resolve: { 
      deps: ['$ocLazyLoad', function($ocLazyLoad) { 
       return $ocLazyLoad.load({ 
        name: 'MyApp', 
        insertBefore: '#ng_load_plugins_before', 
        files: [ 
          path + 'js/controllers/Tab1Controller.js', 
        ] 
       }); 
      }] 
     } 
    })  

}]); 

Jeder Registerkarte Controller js-Datei enthält einen Dienst für das Abrufen und Bearbeiten von Daten. d. h. Tab1Model, Tab2Model usw. Die Struktur jeder Tab-Controller-Datei ist etwas wie unten gezeigt.

Inhalt einzelner Registerkarte Datei

angular.module('MyApp').controller('Tab1Controller',['$scope', '$rootScope', 
function($scope, $rootScope, { 
    //Get data using tab1Model and update UI 

//----------- Save data ------------------------------------------ 
    $rootScope.$on('SaveAll', function() { 
     tab1Model.putData(arr); 
    }); 
]); 

//Data model 
angular.module('MyApp').factory('tab1Model', ['$rootScope', '$q', '$Http', function($rootScope, $q, $http){ 

//get data from database using $http get 
// .......some get code goes here..... 

//Save data to database using $http put 
model.putData = function(data){ 
    var deferred = $q.defer(); 
     $http.put("dummyurl", JSON.stringify(data)).then(
      function(response) { 
       deferred.resolve(response); 
      }, 
      function(response) { 
       deferred.reject(response); 
      }) 
     return deferred.promise; 
}; 

return model; 
}]); 

Das gleiche gilt der Registerkarten für die Erholung. Es gibt eine Run-Taste in der Kopfzeile, die "SaveAll" sendet.

Nun ist die Frage:

Ich möchte einen Prozess auf dem Server ausgeführt werden, wenn „SaveAll“ auf jedem Tab beendet ist. Es gibt ungefähr 5-6 Registerkarten. Woher weiß ich, dass "SaveAll" auf allen Tabs abgeschlossen ist? (einzelne Registerkarten-Controller-js-Dateien werden zur Laufzeit mit Lazy Load geladen)

+0

wäre viel einfacher, wenn Sie nur einen Tab-Service hätten, in dem Sie verfolgen könnten, wie viele Tabs derzeit aktiv sind und alle Anfragen diesen Dienst passieren würden. Dann könnten Sie ein Array von Versprechungen und '$ q.all()' verwenden, um zu lösen, wenn alle Versprechen gelöst sind – charlietfl

Antwort

0

Es wäre besser, wenn Sie Synchronisierungsmuster beim Aufruf des Sicherungsdienstes verwenden. Entweder können Sie einen einzelnen Sicherungsdienst erstellen, der $ q pattern verwendet und den Auftrag erledigt hat, oder Sie können das HTTP-Antwortmuster (Dienst nach Dienst) verwenden, um die Synchronisierung zu erreichen.

Verwandte Themen