2017-01-16 11 views
1

を通じて、私は私のAngular2アプリでポップオーバー型コントローラ用部品の工場を建設しようとしています。を注入角度コアサービスを手動ではなく、コンストラクタ

すべての依存関係とコンポーネントをコントローラに渡し、十分に機能するcomponentFactoryResolver.resolveComponentFactoryを使用して作成します。

私は、依存関係への参照を渡す必要はありませためにそれを管理する方法を見つけ出すことはできません、発信者のためにしたいと思います。私はReflectiveInjector.resolveAndCreateで試してみましたが、管理していないようです。私はインポートし、このサービスのすべての消費者を介して渡すことなく、ComponentFactoryResolverとViewContainerRefにアクセスできるように、私はこれを設定するにはどうすればよい

?私は、引用文献の周りに渡しておく必要はありませんしたいのですが、上記は素晴らしい作品と完璧にmyComponentというを構築PopoverControllerに

発信者/プレゼンター

myPopover = new PopoverController(this.componentFactoryResolver, this.viewContainerRef, MyComponent); 

の下

を、現在の設定を参照してください。私の呼び出し元のComponentFactoryResolverとviewContainerに、理論的にはこれらのサービスを気にするべきではありません。

私は以下のようなものを試してみましたが、それは

var injector = ReflectiveInjector.resolveAndCreate([ComponentFactoryResolver, ViewContainerRef]); 

答えて

2

ReflectiveInjectorが新しいインジェクタインスタンスを作成し、適用されない動作させるために管理していません。注射器のインスタンスは、別の注射器からの参照によって渡す必要があります。使用可能なインジェクタインスタンスがない場合、ルートインジェクタはthis techniqueで取得できます(おそらく、設計に問題があることを示しています)。

ViewContainerRefサービスではありません。@angular/coreサービスでは、シングルトンインスタンスではなく、特定のコンポーネント固有のインスタンスです。インジェクタでは取り出せません。

もちろん、viewContainerRefを参照渡しする必要があります。

It has injector propertyが、これは他の依存関係がviewContainerRefと一緒に渡す必要がないことを意味し、彼らはその場で取得することができます。

上記受け入れ答えに触発さ
const { injector } = viewContainerRef; 
const componentFactoryResolver = injector.get(ComponentFactoryResolver); 
0

、私はにFactory Providersを使用する方法を発見しましたより一般的にViewContainerRefComponentFactoryResolverクラス間の関係に依存するよりもこれを実現する、あまりにもそれらを必要と私のコードは、皮肉にも十分なものの:)

my.service.provider.ts

import {MyService} from './my.service'; 
import { 
    ComponentFactoryResolver, 
    RendererFactory2, 
    ViewContainerRef 
} from '@angular/core'; 

const myServiceFactory = (rendererFactory, viewContainer, componentFactoryResolver) => { 
    return new MyService(rendererFactory, viewContainer, componentFactoryResolver); 
}; 

export const MyServiceProvider = { 
    provide: MyService, 
    useFactory: myServiceFactory, 
    deps: [RendererFactory2, ViewContainerRef, ComponentFactoryResolver] 
}; 

サービス

@Component({ 
    ... 
    providers: [MyServiceProvider], 
    ... 
}) 
を必要成分から抜粋
関連する問題