Routage dynamique par sous-domaine avec AngularJS

Comment puis-je remplacer l'URL du modèle en fonction du sous-domaine?

Tous mes sous-domaines indiquent la même racine de doc.

Domaine de base: exemple.com

$routeProvider.when('/', {templateUrl: 'views/example.com/home.html'}); 

Sous-domaine: sub.example.com

 $routeProvider.when('/', {templateUrl: 'views/sub.example.com/home.html'}); 

Les partiels doivent être indifférents au contenu statique / dynamique. Si un contrôleur à l'intérieur d'une partie effectue des appels de service pour les données, cet intercepteur ne doit pas interférer avec cela.

Facile et propre: j'observerais la fenêtre.location dans la fonction qui configure vos itinéraires, définit une variable en fonction du sous-domaine, puis utilise cette variable lors de la configuration des routes. Comme dans:

 var isSubDomain = window.location.host.indexOf("sub") == 0 var urlPath = isSubDomain ? "sub.example.com" : "example.com"; ... $routeProvider.when('/', {templateUrl: 'views/' + urlPath + '/home.html'}); 

TL; DR: utilisez JavaScript, pas angulaire

Une suite à ce problème conduit à cette question , mais la réponse est applicable pour les deux:

J'ai décidé d'aller avec une stratège locale pour deux raisons:

  1. Il n'y a pas de frais généraux additionnels de demande XML.
  2. 404 messages ne modifient pas les logs de la console lorsque la ressource n'existe pas.

Services.js

 factory('Views', function($location,$route,$routeParams,objExistsFilter) { var viewsService = {}; var views = { subdomain1:{ 'home.html':'/views/subdomain1/home.html' }, subdomain2:{ }, 'home.html':'/views/home.html', }; viewsService.returnView = function() { var y = $route.current.template; var x = $location.host().split("."); return (x.length>2)?(objExistsFilter(views[x[0]][y]))?views[x[0]][y]:views[y]:views[y]; }; viewsService.returnViews = function() { return views; }; return viewsService; }). 

Controllers.js

 controller('AppController', ['$scope','Views', function($scope, Views) { $scope.$on("$routeChangeSuccess",function( $currentRoute, $previousRoute ){ $scope.page = Views.returnView(); }); }]). 

Filters.js

 filter('objExists', function () { return function (property) { try { return property; } catch (err) { return null } }; });