2017-08-22 4 views
0

通常、私はこのように私のコンポーネントに行きます。注入することなく角度ルータのインスタンスを取得するにはどうすればよいですか?

import { Router } from "@angular/router"; 

@Component({ ... }) 
export class CompyTheComponent { 
    constructor(private router: Router) { 
    console.log(router.url); 
    } 
} 

私はそれを注入せず、それの参照を取得したい場合は?私はそれを作成しようとしましたが、私が理解できなかったすべてのパラメータで亡くなりました。それは一般的な(推奨されていない)方法ではないので、それにはあまりgooglearchがありません。あなたのmain.tsに続いて

import { Injector } from "@angular/core"; 

let appInjectorRef: Injector; 

export function appInjector (injector?: Injector): Injector { 
    if (!injector) { 
     return appInjectorRef; 
    } 
    appInjectorRef = injector; 
    return appInjectorRef; 
} 

let routy : Router = new Router(...); 
+0

なぜ注射したくないですか? – Zircon

+0

@ジルコン私はそれが**できるかどうか不思議です**。私は一度静的な方法を助けてセットアップしていたので、それが問題になったのです。私はそれが珍しいアプローチだと認めます。問題は、実用的ではなく学問的なものです。 –

+0

ルーターは、すべての依存関係も手動でインスタンス化する必要がある複雑なプロバイダーです。依存関係には、コンパイラやインジェクタのようなコアなものが含まれています。あなたは手でAngularアプリ全体を最初から作り直すことになります。可能な理論では、実際には時間の無駄です。 – estus

答えて

0

ファイルを作成するには、次のコードでinjector.tsと呼ば

bootstrap([...]).then((appRef: { injector: Injector }) => appInjector(appRef.injector)) 
    .catch((err: Error) => console.error(err)); 

次に、あなたのようにそれを使用することができます。

const router: Router = appInjector().get(Router); 

にどんな場合でも、私はこれ以上の依存性注入をお勧めします。

+0

これは実際には注入であり、コンストラクタインジェクションではなく、本当にラウンドアバウトのやり方です。それを「通常の」方法で行うほうがよい。 – GreyBeardedGeek

関連する問題