2013-09-02 5 views
11

Ho un singolo configService nel mio progetto AngularJS che recupera alcuni valori di configurazione dell'intero progetto dal server tramite una richiesta ajax, ovvero come se l'utente debba o meno essere moderato prima che il loro account sia attivato.Rimanda il caricamento di tutta la pagina in AngularJS fino a quando il servizio ajax non è terminato

Per visualizzare le informazioni in base alla configurazione, l'intero caricamento della prima pagina deve essere posticipato fino al completamento di questa richiesta. Il mio servizio si presenta come:

angular.module('clientApp').factory('configService', function ($http) { 
    var configService = {}; 
    var conf = {}; 

    Object.defineProperty(configService, 'serverConfig', { 
     get: function() { 
      return conf; 
     } 
    }); 

    $http.get('/api/config').success(function (data) { 
     conf = $.extend(conf, data); 
    }); 

    return configService; 
}); 

Quindi, dal momento che il servizio è un Singleton, questo sarà eseguito solo una volta quando la pagina viene caricata, non su ogni cambiamento del percorso.

Ora so come usare $q e promette, ma il mio problema è come può differire l'esecuzione di TUTTO di angolare fino a quando questo servizio ha terminato la sua richiesta? La maggior parte delle mie visualizzazioni richiede valori da configService.serverConfig e dipendono da esso per un comportamento specifico: farlo in modo asincrono e avere un defered.then() in ogni controller non sembra l'idea migliore.

+0

hai trovato una soluzione? –

+1

No, solo una soluzione alternativa (che non si basa sulle opzioni di configurazione per essere disponibili al caricamento della pagina). Un upvote potrebbe aumentare le probabilità :) – Dyna

risposta

1

Ho scritto un modulo angolare che emette un evento 'ajaxComplete' di rootScope una volta completate tutte le richieste iniziali di ajax.

Utilizza un intercettore angolare che reimposta un timer quando viene inviata una nuova richiesta e tiene traccia del numero di richieste in sospeso. Quindi considera le richieste Ajax iniziali completate al ritorno di tutte le risposte e non vengono inviate nuove richieste per 500 millisecondi. C'è un esempio nel progetto git.

Felice codifica.

https://github.com/jcarras/angular-ajax-complete