2012-11-09 13 views
9

Właśnie uczę się angularJS (przy użyciu nasienia kątowego) i muszę załadować konfigurację mojej witryny z kanału JSON przed załadowaniem reszty strony.AngularJS: Jak załadować kanał json przed załadowaniem aplikacji?

Niestety, użycie $ http lub $ resource nie zwróci kanału w czasie, aby załadować pozostałą aplikację.

Jaki jest właściwy sposób zmuszenia aplikacji do załadowania tych danych przed resztą aplikacji?

Odpowiedz

5

Należy użyć metody Controller.resolve. Sprawdź odpowiedź Misko (jedna z głównych deweloperów Angular): https://stackoverflow.com/a/11972028/726711

+0

Dzięki, utworzyłem I kontroler konfiguracji witryny i użyłem rozwiązania, aby włączyć go do wszystkich innych kontrolerów, które go potrzebowały. Wszystko działa, ale wydaje mi się, że może być lepszy sposób na zrobienie tego. – Bunkered

+5

Co się stanie, jeśli kontroler nie jest podłączony do trasy? –

0

Użycie metody rozwiązania spowodowało zerwanie wszystkich testów jednostkowych ... Poszłam w ten sposób, gdzie ustawienia są usługą.

$q.when(settings.loadConfig()).then(function() { 
    console.log(settings.versionedApiUrl); 
}); 

Następnie sprawdzam, czy mamy już załadowane ustawienia, aby upewnić się, że nie wymagamy więcej niż raz.

class settings { 
    loadConfig = ():angular.IPromise<any> => { 

       var deferred = this.q.defer(); 

       if(this.settingsLoaded ){ 
         deferred.resolve({}) 
         return deferred.promise; 
       } 

       this.http({ 
         url:'config.json' 
       }).then((result) => { 

         if(result.data){ 
          this.versionedApiUrl = result.data.versionedApiUrl; 
          this.apiServer = result.data.apiServer; 
          this.widgetServiceRoot = result.data.widgetServiceRoot; 
          this.settingsLoaded = true; 
         } 

         deferred.resolve({}); 
       }); 
       return deferred.promise; 
      } 
} 
Powiązane problemy