Comment définir AngularjJS URL de base de façon dynamique en fonction extraites de la variable d'environnement?
J'ai de développement et de production de l'environnement dans lequel mon URL diffèrent:
de production:
www.exmaple.com/page
développement:
dev.environment/project/page
Je sais que je peux mettre l'URL de base dans AngularJS avec le
<base href='/project/' />
mais cela ne veut pas m'aider ici. Avant que je charge mon AngularJS application, j'ai récupérer un fichier de config (en app.js avec le .run
déclaration, qui lit une variable de l'environnement:
]).run([
'$rootScope',
'$http',
function (
$rootScope,
$http
) {
var configDeferred = $q.defer();
//fetch config and set the API
$http.get('config.json').then(function(response) {
$rootScope.config = response.data;
configDeferred.resolve();
});
//Wait for the config to be loaded, then go to state
$rootScope.$on('$stateChangeStart', function (event, next, current) {
event.preventDefault();
$q.all([configDeferred.promise]).then(function() {
$state.transitionTo(next.name);
return;
});
});
Est-il un moyen de définir dynamiquement l'URL de base, fondée sur une récupérés fichier de config dans AngularJS (peut-être avec un .htaccess)?
Tentative 1:
Essayez d'obtenir la configuration via .run
et de définir l'url de base par ng-href:
Modifier la ligne de code suivante dans mon app.js:
//fetch config and set the API
$http.get('config.json').then(function(response) {
$rootScope.config = response.data;
$rootScope.baseUrl = response.data.baseUrl; //'/project/'
configDeferred.resolve();
});
et dans mon index.html:
<base ng-href="{{baseUrl}}" />
Il ressemble à ce qui ne fonctionne pas: lorsque je modifie l'attribut href de la balise de ng-href, il charge le contenu correctement, mais les changements de mon URL pour dev.environment/page
au lieu de dev.environment/project/page
Mise à JOUR:
Le fichier de configuration:
{
"mode": "development",
"baseUrl": "/project/"
}
- vraiment pas sûr de ce que l'implication est ou ce que vous avez besoin d'aide avec
- A déclaré la question différemment
- pas encore clair quel est le problème avec l'url...peut analyser
location.href
pour déterminer url existante si ça peut aider - Selon AngularJS docs, j'ai besoin de l'url de base dans mon index.html fichier (dans le <base> tag), qui est chargé en premier, puis app.js est chargé. Dans app.js j'ai un $requête http à un fichier de config, qui a le droit de l'environnement et par conséquent, le droit à l'URL de base qui doit être défini. Donc après avoir récupéré le fichier de config, j'ai besoin d'un moyen de définir l'url de base
- ne pouvez-vous pas avoir le code de serveur, il suffit d'assigner une variable dans une balise script? Ou analyser le
location.href
? - L'obtention et la configuration via une balise script n'est pas la voie que je veux faire (je veux utiliser le framework). L'analyse de l'emplacement.href est une option, mais une fois de plus, souhaitez-vous exactement comment le faire en utilisant le cadre?
- vérifie : (1) est votre ng-app attribut de balise html? (2) je ne vois pas tout configDeferred.filtrer dans votre code (3) Lors de l'utilisation de ng-href utilisation inspecter l'élément pour voir si angulaire réellement injectée interpolées {{baseUrl}}
- 1: oui 2: vous avez oublié de copier, de la mise à jour 3: C'est la mise à jour du html
<base ng-href="/project/" href="/project/">
- Pouvez-vous nous montrer votre config.json?
- Je viens de l'ajouter
- <base href="/" ng-href="{{baseUrl}}" > cela a fonctionné pour moi et en run block $rootScope.baseUrl = BASE_URL; //BASE_URL est récupéré à partir de config qui est imprégnée par gulp pendant le processus de génération
Vous devez vous connecter pour publier un commentaire.
Personnellement, je fais ce genre de trucs avec
grunt
.Quand je lance mon angulaires-app, j'ai plusieurs tâches :
Puis grunt ne les chaînes de remplacement avec l'aide de la
grunt-preprocess
module :mon
constants.tpl.js
fichier est analysé :et l'url est rempli.
Il ya des possibilités infinies (chaîne de remplacement, de copie de fichier, etc).
De le faire avec grunt s'assurer que les dev fichiers de configuration, ne pas aller dans la production, par exemple..
Je peux mettre plus de détails si vous êtes intéressé, mais je voulais seulement vous montrer une approche différente.
modifier gruntFile exemple :
Maintenant, la commande :
va créer un nouveau fichier avec une url
asumming vous avez créé un service qui devient objet de configuration de serveur
balisage
note
dev.environment/page
au lieu dedev.environment/project/page
.<base href="{{baseUrl}}">
, mais cela me donne l'erreur suivante:Error: A history state object with URL 'http://0.0.1.148/' cannot be created in a document with origin 'http://dev.environment'.
. Peut-être bon de dire que j'utilise aussi angular-ui-routeren utilisant la base des url peut-être pas la meilleure chose, car il peut aussi visser le fonctionnement de l'ancrage des balises et pourrait conduire à l'onu voulu de navigation. L'approche que vous avez de lire la configuration à partir d'un fichier XML est parfait et c'est ce que j'ai fait:
1.Avant l'initialisation de votre angulaire de l'app lire une variable à partir de votre fichier de configuration:
laissez votre config.xml avoir un tel champ
2.maintenant injecter une constante dans votre application pour cela, j'ai été guidé par Eddiec et Cd
3.vous pouvez utiliser BASE_URL n'importe où dans votre application que vous devez injecter ce est la façon dont je l'ai utilisé pour éviter les chemins codés en dur dans ui.router.js
espère que cela aide les acclamations!
J'ai essayé de résoudre ce problème et je n'ai vraiment pas envie de mettre mon chemin d'accès de base dans certains fichier de configuration. Nous travaillons avec de nombreux développeurs sur notre application et l'environnement de travail différent. Finalement, j'ai trouvé une solution que je ne suis pas vraiment fier, mais il fonctionne comme un charme. Elle ne nécessite qu'une seule chose: PHP.
Donc au lieu d'écrire de la base href votre JS en tête, essayez ceci:
Si vous avez déjà PHP sur votre serveur, ce n'est que question de renommer vos
index.html
àindex.php
(aussi ne pas oublier.htaccess
si vous en avez un).Je sais que cette solution n'est pas bonne pour tout le monde, il n'est pas censé le faire, c'est un peu ma solution de problème pour ceux, qui ont PHP déjà sur le serveur. J'espère que cette aide pour au moins certains d'entre vous 🙂