現在のルートのコンポーネントへの参照を取得する明確な方法はありますか?Angular 2のルータで現在のルートのコンポーネントへの参照を取得しますか?
は、これが動作しているようですが、非常にハックようだ:
this.router.currentInstruction.
component.componentType.prototype.somePropertyOrFunction();
現在のルートのコンポーネントへの参照を取得する明確な方法はありますか?Angular 2のルータで現在のルートのコンポーネントへの参照を取得しますか?
は、これが動作しているようですが、非常にハックようだ:
this.router.currentInstruction.
component.componentType.prototype.somePropertyOrFunction();
実際には、あなたの表現で現在のルートに関連するコンポーネントのインスタンスにアクセスすることはできません。コンポーネントタイプのみを取得します。そのため、プロトタイプを使用する必要がありますが、関数への参照を取得し、コンポーネントインスタンスのメソッドを参照しません。
this
キーワード(メソッド内で使用されている場合)は未定義です。ルートがアクティブになったとき
現在のルートに関連するコンポーネントのインスタンスにアクセスするには、共有サービスにこのインスタンスを設定するにはOnActivate
フックインターフェースを活用できます。
@Component({
selector: 'some-cmp',
template: `
<div>routerOnActivate: {{log}}</div>
`})
export class SomeCmp implements OnActivate {
constructor(private service:RouteStateService) {
}
routerOnActivate(next: ComponentInstruction, prev: ComponentInstruction) {
this.service.setCurrentRouteComponent(this);
}
}
は次に、あなたがアクセスできるようになりますコンポーネントインスタンスこの方法:
var component = this.service.getCurrentRouteComponent();
興味深いことに、activatedRouteのコンポーネントインスタンスへの参照がないのはなぜですか、時にはそこにあることは非常に便利です – pleerock
によってレンダリングインスタンスを格納するために角度が使用するステートフルサービスの一種であるRouterOutletMap
を使用してコンポーネントインスタンスにアクセスすることが可能ですディレクティブ。あなたはこれらの型を必要とするかもしれません:
import { Router, RouterOutletMap, RouterOutlet } from '@angular/router';
トップレベルoutletMap
はrouter
の財産ですが、any
にキャストが必要になる場合がありますので、それがTSに表示されていない:
constructor(private router:Router) {
const rootOutletMap:RouterOutletMap = (<any>this.router).outletMap;
}
RouterOutletMap
はjavascriptのですプロパティ_outlets
を持つオブジェクト。この_outlets
は、コンセント名によるRouterOutlet
のインスタンスを含むハッシュマップオブジェクトです。アウトレットに名前がない場合、それは「プライマリ」になります。あなたがRouterOutlet
を得た後には、コンポーネントのインスタンスを取得することができます
const rootOutletMap:RouterOutletMap = (<any>this.router).outletMap,
outletsHash = (<any>rootOutletMap)._outlets,
primaryOutlet:RouteOutlet = outletsHash['primary'], // 'primary' is the default name
component = primaryOutlet.component; // <-- this is the instance
RouterOutletMap
は木なので、ルートマップはように子供たちへの言及があります。ルックアップ手順を編成して、必要に応じて特定のルートのコンポーネントを見つけることができます。あなたはこのように行く場合
// returns an array of all the router-outlets component currently rendered
private getComponentsChain(routerOutletMap: RouterOutletMap) {
const outlets: any = (<any>routerOutletMap)._outlets,
outletsList = [],
components = [];
_.forOwn(outlets, (value: RouterOutlet, key: string) => {
outletsList.push(value);
components.push(value.component);
});
const recursiveComponents = _.flatMap(
outletsList,
(o: RouterOutlet) => this.getComponentsChain(o.outletMap));
return [...components, ...recursiveComponents];
}
/* ...then somewhere in component: */
console.log(this.getComponentsChain((<any>this.router).outletMap));
いくつかのポイントに注意する:ここでは、再帰的な要素の抽出の一例であるが、将来的に変更される可能性がありますので
どこからこのヒントを受け取りたいですか? –
私のルートを設定するメインコンポーネント – wannabeartist
私はそれを得る方法だと思っていますが、 'prototype'レベルを削除してメソッドを呼び出すことができます;-) –