2016-10-09 5 views
0

URL内のサブドメインに基づいてAngular2 Routerでルーティングしようとしています。たとえば、誰かがtest.domain.comをリクエストした場合、「テスト」ルートを取得します。タイムアウトの遅延を設定せずにngOnInitからrouter.navigateを実行することはできませんでしたが、コンストラクタから次のものを実行すると動作します。よりクリーンなソリューションがあれば興味がありますか?ここに示されているようAngular2ルーティングはサブドメインに基づいていますか?

{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

あなたは、ナビゲーションを防ぐか、別のパスにリダイレクトするガードを使用することができ、

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

初期化に関連付けられたルータイベントが存在する可能性があるため、そのイベントを使用してナビゲーションをトリガすることができます。 – Robert

1

のsetTimeoutを使用することができます。

@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

あなたの例と同様に 異なるとベースhref

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

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

関連する問題