Ho un servizio di AngularJS, che comunica con il server e restituisce traduzioni di diverse sezioni dell'applicazione:Ui-router AngularJS: come risolvere i dati tipici a livello globale per tutti i percorsi?
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;
}]);
Il nome della sezione è passato come parametro section
della funzione get
.
Sto utilizzando il modulo AngularJS ui-router e seguendo il modello di progettazione descritto here
Così ho i seguenti stati di configurazione:
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'
})
Questo funziona bene, ma come si può notare che devo esplicitamente specificare translations
nel parametro di risoluzione. Penso che non sia abbastanza buono in quanto questo duplica la logica.
Esiste un modo per risolvere le traduzioni a livello globale ed evitare i duplicati del codice. Intendo una specie di middleware.
Stavo pensando di ascoltare il $stateChangeStart
, quindi ottenere traduzioni specifiche per il nuovo stato e collegarle ai controller, ma non ho trovato il modo di farlo.
Qualsiasi consiglio sarà molto apprezzato.
Nota importante: Nel mio caso il codice translations object
deve contenere i dati di traduzione, non servizio/fabbrica/altro.
Cordiali saluti.
Non ho tempo per scrivere una risposta, ma dovrei menzionare che le definizioni di stato sono semplici oggetti javascript. Puoi metterli in una lista (inserisci la dichiarazione 'name:' come attributo annidato di ogni stato) e scorrere su ciascuno di essi. In ogni stato su cui si esegue l'iterazione, aggiungere la risoluzione. –