Ich habe einen AngularJS Dienst, der mit dem Server kommuniziert und gibt Übersetzungen von verschiedenen Abschnitten der Anwendung:AngularJS UI-Router: Wie können typische Daten global für alle Routen aufgelöst werden?
angular
.module('utils')
.service('Translations', ['$q','$http',function($q, $http) {
translationsService = {
get: function(section) {
if (!promise) {
var q = $q.defer();
promise = $http
.get(
'/api/translations',
{
section: section
})
.success(function(data,status,headers,config) {
q.resolve(result.data);
})
.error(function(data,status,headers,config){
q.reject(status);
});
return q.promise;
}
}
};
return translationsService;
}]);
Der Name des Abschnitts als section
Parameter der get
Funktion übergeben wird.
Ich verwende AngularJS ui-Router-Modul und Muster folgende Design beschrieben here
So habe ich die folgenden Zustände config:
angular.module('app')
.config(['$stateProvider', function($stateProvider) {
$stateProvider
.state('users', {
url: '/users',
resolve: {
translations: ['Translations',
function(Translations) {
return Translations.get('users');
}
]
},
templateUrl: '/app/users/list.html',
controller: 'usersController',
controllerAs: 'vm'
})
.state('shifts', {
url: '/shifts',
resolve: {
translations: ['Translations',
function(Translations) {
return Translations.get('shifts');
}
]
},
templateUrl: '/app/shifts/list.html',
controller: 'shiftsController',
controllerAs: 'vm'
})
Dies funktioniert gut, aber wie Sie kann ich feststellen, ausdrücklich Geben Sie translations
im Parameter resolve an. Ich denke, das ist nicht gut genug, da dies die Logik dupliziert.
Gibt es eine Möglichkeit, Übersetzungen global aufzulösen und die Code-Duplikate zu vermeiden. Ich meine eine Art Middleware.
Ich dachte über das Abhören der $stateChangeStart
nach, dann Übersetzungen für den neuen Zustand und binden sie an Controller, aber ich habe den Weg nicht gefunden, es zu tun.
Jeder Rat wird sehr geschätzt werden.
Wichtiger Hinweis: In meinem Fall muss der aufgelöste translations object
die Übersetzungsdaten enthalten, nicht service/factory/was auch immer.
Mit freundlichen Grüßen.
Ich habe keine Zeit, eine Antwort zu schreiben, aber ich sollte erwähnen, dass Zustandsdefinitionen einfache Javascript-Objekte sind. Sie können sie in eine Liste einfügen (fügen Sie die 'name:' -Deklaration als verschachteltes Attribut für jeden Status ein) und durchlaufen Sie jede einzelne. Fügen Sie in jedem Zustand, in dem Sie iterieren, die Auflösung hinzu. –