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)
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