2016-05-08 9 views
0

Githubのサードパーティ製コンポーネントを使用するコンポーネントがあり、独自のプロバイダを定義しているとします。Angular2で子コンポーネントのプロバイダにアクセスする

<my-component> 
    <awesome-contrib-component></awesome-contrib-component> 
</my-component> 

awesome-contrib-componentプロバイダ向け:私の知る限りがあるため、私はアプリのブートストラップレベルで、あるいはmy-componentFooProviderを提供していても(プロバイダやviewProvidersのいずれかで)、言うことができるように

@Component({ 
    selector: 'awesome-contrib-component', 
    providers: [FooProvider] 
}) 

awesome-contrib-componentは独自のプロバイダであると指定していますが、常にそれ自体のインスタンスになっています。

問題がmy-componentに私がawesome-contrib-componentで使用されているFooProvider同じインスタンスにアクセスする必要があると私はそれを得ることができないんだということです。

これはまったく可能ですか?何か不足していますか?ありがとう!

ここで強調すべき重要なことは、awesome-contrib-componentがGithubのサードパーティ製モジュールであることです。それは自身のプロバイダを定義し、FooProviderをプライベート変数として割り当て、公開しません。

このサードパーティ製のライブラリを使用してPRを開いていない人(私が行ったこと)は、これを回避する方法がわかりません。

+1

あなたは@ViewChildについて話していますか? https://angular.io/docs/ts/latest/api/core/ViewChild-var.html –

+0

@AndreyKartashovはい、ViewChildで参照されているコンポーネントがプロバイダを公開プロパティとして公開していない場合は、私はそれにアクセスする? –

答えて

2

使用@ViewChild、またはあなたが複数の子を持っている場合あなたは間違いなくはい、何かが欠けているこの

@Component({ 
    selector: 'my-component', 
    directives: [AwesomeContribComponent] 
}) 
export class MyComponent{ 
    @ViewChild(AwesomeContribComponent) public childInstance: AwesomeContribComponent 

    ngAfterViewInit(){ 
    console.log(this.childInstance.fooProvider); // you got the service 
    } 

} 

@Component({ 
    selector: 'awesome-contrib-component', 
    providers: [FooProvider] 
}) 
export class AwesomeContribComponent { 
    constructor(public fooProvider: FooProvider){} 
} 
+0

ここで強調すべきことは、サードパーティ製のモジュールであり、独自のプロバイダを定義し、そのコンストラクタに非公開で割り当てていることです。私は内側から外側に変更する方法がありません。私の知識では –

+1

、NO。開発者にそれを出力として提供するか公開するよう依頼できるかどうかを確認してください。 –

1

のように、@Childrenを使用! :)

同じプロバイダーインスタンスを子と親にしたい場合は、それを親コンポーネント(子ではない)、それを使用している子(提供しない)で提供するだけです同じインスタンスを持ちます。

プロバイダ/依存性の注入/サービスに関する

より:https://angular.io/docs/ts/latest/guide/hierarchical-dependency-injection.html

+0

サードパーティのコンポーネントなので、自分のプロバイダが設定されているという事実を変更することはできません! –

+1

ああ、私はあなたが何かを欠けているとは思わない。おそらく、おそらく第三者のコンポーネントが** @ input()**メタデータなどでいくつかのものを公開するべきではないかと思います。 – tibbus

関連する問題