2016-10-09 2 views
0

Ich versuche, in Angular2 Router basierend auf der Sub-Domain in einer URL zu routen. Zum Beispiel, wenn jemand test.domain.com anfordert, erhalten sie die "Test" Route. Ich konnte router.navigate nicht von ngOnInit arbeiten, ohne eine Zeitüberschreitung zu setzen, aber das Ausführen des folgenden vom Konstruktor funktioniert. Wäre es interessant, wenn es eine sauberere Lösung gäbe?Angular2 Routing basierend auf Subdomain?

{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

funktioniert es nicht? – micronyks

+0

Routing funktioniert in der App, aber nicht von ngOnInit. – Robert

Antwort

1

können Sie verwenden SetTimeout wie hier gezeigt,

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

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


    } 
}; 
+0

Danke für den Vorschlag. Ja, funktioniert mit setTimeout. Ich werde ein wenig mehr Nachforschungen anstellen, um zu sehen, ob es eine andere Möglichkeit gibt, die Navigation zu verzögern, bis der Router initialisiert ist. – Robert

+0

AFAIK Sie haben keine anderen Optionen, aber überprüfen Sie und aktualisieren Sie mich für das gleiche. – micronyks

+0

Möglicherweise ist ein Router-Ereignis mit der Initialisierung verbunden, daher kann dieses Ereignis möglicherweise zum Auslösen der Navigation verwendet werden. – Robert

1

Sie Guards verwenden Navigation zu verhindern oder auf einen anderen Pfad umgeleitet werden. Ähnlich wie Ihr Beispiel:

@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; 
    } 
} 

die Wache zu übernehmen Sie es hinzufügen sollten die Anbieter Modul und konfigurieren Route:

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

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

Auch nehme ich an, dass Sie Ihre Anwendung konfiguriert werden konnten mit anderen 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