Das Ergebnis von $http.get
ist nicht verfügbar, während die App initialisiert wird. Es ist nur verfügbar, wenn der Server es liefert. Aus diesem Grund ist es einfach unmöglich, diesen Wert in einem Modul konstant zu halten. Sie laufen das Risiko von
Was Sie jedoch tun können, ist den Anruf um $http.get
in einem Dienst zu wickeln und diesen Dienst injizieren, wo immer Sie die Konstante möchten. (Beachten Sie, dass Leistungen nicht in Config-Blöcke injiziert werden.)
// 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;
});
});
Der etwas umständlich Modus der Wert Ihres almostConstant zugreifen zu seiner asynchronen Natur zurückzuführen ist. Es ist einfach zu einem unbestimmten Zeitpunkt verfügbar, so dass der Versuch, auf synchrone Weise darauf zuzugreifen, eine Menge subtiler Timing-Bugs einführt.
Eine sehr nicht angular-ish Weg dies zu tun wäre, Ihre Konstante in der JS-Datei direkt zu schreiben. Im Moment kann Ihr Server eine Anfrage an 'url'
mit einem Wert beantworten.
angular.module('A').constant('theConstant', result);
wo Ergebnis ist offensichtlich Ihre Konstante: Stattdessen könnte man es auf eine Anfrage zu 'url.js'
mit der folgenden Zeichenkette machen beantworten. Wenn Sie zum Beispiel PHP im Backend wurden verwendet, könnte es etwa so aussehen:
<?php
header('Content-Type: application/javascript');
$constant = retrieveMyConstant();
?>
angular.module('A').constant('theConstant', <?php echo $constant; ?>);
Vergewissern Sie sich, dass die Konstante sieht tatsächlich wie ein JavaScript-Wert. Wenn es sich um eine Zeichenfolge ist, wickeln Sie es in '
, wenn es sich um ein JSON-Objekt schreiben seine Serialisierung ist usw.
Danach Sie einfach ein Skript-Tag enthalten Hinweis auf url.js
in Ihrer index.html
Datei.
Beachten Sie, dass diese Lösung synchron ist. Wenn das Abrufen der Konstante auf dem Server eine Weile dauert, wirkt sich dies auf die Ladezeit Ihrer Seite aus.
was 'theValueFromHttpCall'? – akonsu
@akonsu Die Frage wurde aktualisiert. In meinem Fall wäre die Antwort ein JSON-Objekt. –
interessant. Ich würde vermuten, dass der Injektor bereits alle Komponenten beim Booten definiert hat, also denke ich, dass es notwendig ist, direkt mit ihm zu arbeiten, um dein Szenario zu aktivieren. – akonsu