2015-01-01 17 views
6

La mia app AngularJS effettua chiamate a un'API attualmente ospitata in un servizio, ma precedentemente ospitata in un'altra e nel prossimo futuro è probabile che venga ospitata da qualche altra parte.Qual è il modo migliore per archiviare URL o domini URL nell'app AngularJS?

L'URL cambia regolarmente. Per esempio da

myfirst.heroku.com/app/user/mike/profile 

a

mysecond.bluemix.com/app/user/mike/profile 

ecc

Invece di cambiare l'URL in ogni ogni luogo, voglio solo dover cambiare la parte prima del /app....

In un'app angolare qual è il modo migliore per farlo?

NOTA: Molti degli URL che uso in tutta l'app, sono in moduli aggiunti come dipendenze alla mia app principale. Pertanto, Module1 e Module2 utilizzano l'URL nei rispettivi controller e risorse e vengono quindi inclusi in MainApp. Quindi una buona soluzione per me deve essere accessibile a tutte le app dipendenti. È possibile.

+0

Uso .value() o .contant() ed iniettarlo in – Martin

risposta

12

Vorrei suggerire che è necessario utilizzare costante angolare, è simile a un servizio ma crea un valore costante che può essere iniettato ovunque nel nostro progetto angolare.

Questo è come possiamo creare costante

servizio costante:

angular.module('AppName') 
.constant('REST_END_POINT', 'https://rest.domain.com/'); 

Usi nel controllore:

angular.module('AppName') 
.controller('CTRL_NAME', ['REST_END_POINT', '$scope', function(REST_END_POINT, $scope){ 
     //your business logic. 
]); 
+0

Se 'AppName' ha altri moduli iniettato in esso, può Io uso la costante 'REST_END_POINT' anche in quei moduli? – CodyBugstein

+1

Se si sta lavorando al modulo AppName come progetto e si dispone di un set diverso di moduli iniettati rispetto a questo servizio REST_END_POINT può essere utilizzato all'interno dell'AppName solo perché il servizio REST_END_POINT viene creato nel modulo AppName in modo che non possa essere accesso all'esterno. Se vuoi davvero usarlo in moduli diversi, dovresti creare un modulo diverso denominato RestApp che avrà il servizio REST_END_POINT. Quindi, finalmente, puoi inserire il modulo RestApp dove vuoi esattamente come altri moduli. – CrazyGeek

+0

Quello che ho finito per fare è stato, come descritto da CrazyGeek, creare un nuovo modulo, che conteneva tutti i diversi tipi di costanti e iniettarlo in ogni modulo che ne ha bisogno – CodyBugstein

0

io faccio uso di richiesta di intercettazione per questo

csapp.factory('MyHttpInterceptor', [function() { 

     var requestInterceptor = function (config) { 

      var prefix = "http://api.example.com"; 

      if (config.url.indexOf("/api/") !== -1) { 
       config.url = prefix + config.url; 
      } 
     } 
}]); 

configurare questa intercettazione in app.config come

csapp.config(["$httpProvider", function($httpProvider) { 
     $httpProvider.interceptors.push('MyHttpInterceptor'); 
}); 

ora tutte le vostre richieste API sarebbe prefisso api.example.com.

+0

dove è aggiunto questo intercettore a $ httpProvider'? – CodyBugstein

+1

aggiornato come da commenti – harishr

0

$ location.host() è il 'prefisso.dominio.suffisso' del browser client È possibile inserire la posizione $ in qualsiasi ambito o servizio.

angular.module('app',[]).run(function($rootScope, $location){ 
    $rootScope.host = $location.host(); 
}) 

Plunk:. http://plnkr.co/edit/gDgrlwZFyWNKUJgbHHKj?p=preview

<!DOCTYPE html> 
 
<html ng-app="app"> 
 
    <head> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.3.7/angular.js"></script> 
 
    </head> 
 
    <body> 
 
    <i>Host:</i> 
 
    <h1>{{host}}</h1> 
 
    <script> 
 
     angular.module('app',[]).run(function($rootScope, $location){ 
 
     $rootScope.host = $location.host(); 
 
     }); 
 
    </script> 
 
    </body> 
 
</html>

+1

CrazyGeek ha risposto alla tua domanda in modo più preciso, ti sto solo risparmiando il passo di dover cambiare manualmente l'host. – irth

+0

Grazie per la bella punta. Non userò esattamente questa soluzione, ma è utile saperla – CodyBugstein

Problemi correlati