Il risultato di $http.get
non è disponibile mentre l'app è inizializzata. È disponibile solo quando il server lo consegna. Per questo motivo è semplicemente impossibile mantenere quel valore in una costante di modulo. Corri il rischio di
Ciò che puoi fare, tuttavia, è racchiudere la chiamata a $http.get
in un servizio e iniettare quel servizio ovunque tu voglia la costante. (Si noti che i servizi non possono essere iniettati in blocchi di configurazione.)
// grab the "constant"
angular.module('A').factory('almostConstant', function() {
return $http.get('url').then(function(response) {
return response.data;
});
});
// use the "constant"
angular.module('A').controller('controller', function($scope, almostConstant) {
almostConstant.then(function(data){
$scope.almostConstant = data;
});
});
La modalità leggermente scomodo per accedere al valore del almostConstant è dovuta alla sua natura asincrona. Semplicemente è disponibile in un tempo non specificato, quindi provare ad accedervi in modo sincrono può introdurre molti piccoli bug temporali.
Un modo molto non angolare di farlo sarebbe scrivere direttamente la costante nel file JS. Al momento il tuo server può rispondere a una richiesta a 'url'
con un valore. Invece, si potrebbe rendere risposta ad una richiesta di 'url.js'
con la seguente stringa:
angular.module('A').constant('theConstant', result);
cui risultato è, ovviamente, la vostra costante. Per esempio, se si sta utilizzando PHP sul back-end che potrebbe essere simile a questa:
<?php
header('Content-Type: application/javascript');
$constant = retrieveMyConstant();
?>
angular.module('A').constant('theConstant', <?php echo $constant; ?>);
Assicurarsi che la costante si presenta come un valore JavaScript. Se si tratta di una stringa, avvolgerlo in '
, se si tratta di un oggetto JSON scrivere la sua serializzazione, ecc
Dopo questo si include semplicemente un tag script che punta al url.js
nel file index.html
.
Si noti che questa soluzione è sincrona, quindi se il recupero della costante sul server richiede un po ', ciò influirà sul tempo di caricamento della pagina.
ciò che è 'theValueFromHttpCall'? – akonsu
@akonsu Aggiornamento della domanda. Nel mio caso, la risposta sarebbe un oggetto JSON. –
interessante. Direi che l'iniettore ha già tutti i componenti definiti all'avvio, quindi penso che sia necessario lavorarci direttamente per abilitare il tuo scenario. – akonsu