2013-06-02 4 views
2

Как переопределить URL шаблона на основе поддомена?Динамическая маршрутизация поддоменом с помощью AngularJS

Все мои поддомены указывают на один и тот же корень документа.

Домен Основание:example.com

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

Поддомен:sub.example.com

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

Partials должны быть безразличны к статическому электричеству/динамический контент. Если контроллер внутри частичного сообщения делает служебные вызовы для данных, этот перехватчик не должен мешать этому.

+0

Ваш шаблон шаблона выглядит как относительный путь к пути вашего индексного файла. Таким образом, чтобы изменить домены (соблюдая ту же политику происхождения), вы должны были бы иметь эти пути абсолютными, возможно, используя константу для их настройки. –

+0

@xmltechgeek Извините, но я думаю, что вы, возможно, пропустили часть, где подчиненные домены указывают на один и тот же корень doc - SOP не имеет к этому никакого отношения. Проблема здесь в том, что мне нужен способ обнаружения домена, чем перехват 'templateUrl' и изменение его для разных поддоменов. –

+0

Не уверен, что вы сможете это сделать с помощью углового маршрутизатора по умолчанию. Вы должны иметь возможность использовать templateProvider в ui-router (https://github.com/angular-ui/ui-router) из команды angular-ui, чтобы это сделать. См. Https://github.com/angular-ui/ui-router/wiki#alternative-ways-to-set-the-template. –

ответ

2

Продолжение Ф.О. этой проблемы приводят к this question, но ответ применим для обоих:

Я решил пойти с местной стражей по двум причинам:

  1. Дополнительных накладных расходов на XML-запрос нет.
  2. 404 сообщения не будут публиковать журналы консоли, если ресурс не существует.

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 
    } 
    }; 
}); 
3

Простая и чистая: я бы осмотрел window.location в функции, которая устанавливает ваши маршруты, устанавливает переменную в зависимости от субдомена, а затем используйте эту переменную при настройке маршрутов. Как и в:

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: использовать JavaScript, не угловая

+1

это грязно, учитывая, что уже есть поставщики маршрутов, у которых есть имя хоста, доступное вам. Вы можете получить доступ к '$ location.host()' wihtin '.run()' –

+0

Итак, Дэн, если он использовал $ location.host() было бы хорошо и легче читать, чем указано выше? – HaveAGuess

Смежные вопросы