2016-10-09 2 views
0

Я пытаюсь маршрутизировать в Angular2 Router на основе субдомена в URL-адресе. Например, если кто-то запрашивает test.domain.com, тогда они получают «тестовый» маршрут. Я не мог получить router.navigate для работы из ngOnInit без установки задержки тайм-аута, но работает работа над конструктором. Было бы интересно, если бы было более чистое решение?Угловая2 маршрутизация на основе субдомена?

{path: 'test',     component: TestComponent} 

this._router.events.subscribe(event => { 
if (event.constructor.name === 'NavigationEnd' 
    && window.location.hostname == 'test.domain.com' 
    && event.url == '/') { 
     console.log(event.url); 
     this._router.navigate(['test']); 
    } 
}); 
+0

Не работает? – micronyks

+0

Маршрутизация работает в приложении, но не из ngOnInit. – Robert

ответ

1

Вы можете использовать SetTimeout, как показано здесь,

ngOnInit() { 
    if (window.location.hostname == 'test.domain.com'){ 
     console.log(window.location.hostname); 

     setTimeout(()=>{ 
     this._router.navigate(['test']); 
     },2000) 


    } 
}; 
+0

Спасибо за предложение. Да, работает с setTimeout. Я сделаю немного больше исследований, чтобы узнать, есть ли другой способ отложить навигацию до тех пор, пока маршрутизатор не будет инициализирован. – Robert

+0

AFAIK у вас нет других опций, но по-прежнему проверяйте и обновляйте меня за то же самое. – micronyks

+0

Может быть событие Router, связанное с инициализацией, поэтому может быть возможно использовать это событие для запуска навигации. – Robert

1

Вы можете использовать гвардию для предотвращения навигации или перенаправлять на другой путь. Подобно вашему примеру:

@Injectable() 
export class RedirectGuard implements CanActivate { 

    constructor(router:Router){} 

    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
     // check if need redirect 
     if (...) { 
      console.log(`requested url: ${state.url}`); 
      this.router.navigate(['/test']); 
      return false; 
     } 
     return true; 
    } 
} 

Чтобы применить защитный кожух вы должны добавить его в модуль поставщиков и настроить Маршрут:

[{ 
    path: '', 
    component: YourComponent, 
    canActivate: [RedirectGuard], 
    children... 
}, 
{ 
    path: 'test', 
    component: YourTestComponent, 
    children... 
}, 
... 
] 

https://angular.io/docs/ts/latest/guide/router.html#!#can-activate-guard

Кроме того, я полагаю, что вы могли бы настроить приложение с различными base href:

let useTestSubdomain: boolean = window.location.hostname == 'test.domain.com'; 

@NgModule({ 
    providers: [{provide: APP_BASE_HREF, useValue: useTestSubdomain ? '/test' : '/'}] 
}) 
class AppModule {} 

https://angular.io/docs/ts/latest/api/common/index/APP_BASE_HREF-let.html

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