2016-07-07 1 views
1

私はシステムのスタイルメタデータをカスタムサービス(私は外部システムから自分のスタイルをロードしています)で補強するために、カスタムのViewResolverクラス(角度の組み込みクラスを拡張)を作成しようとしています。しかし、私は依存注入システムとViewResolverの問題に遭遇しています。カスタムViewResolverと依存性注入

Boot.ts

bootstrap(App, [ 
    MyStyleService, // my custom service 
    SomeOtherService, // another custom service used by MyStyleService 
    { 
     provide: ViewResolver, 
     useClass: MyViewResolver // my custom ViewResolver 
    } 
]) 

MyViewResolver.ts

@Injectable() 
export class MyViewResolover extends ViewResolver { 

    constructor(
     private _reflector: ReflectorReader, 
     // I want to reference 'StyleService' from the providers array in boot.ts 
     private _styleService: StyleService 
    ) { 
     super(_reflector); 
    } 

    public resolve(comopnent: Type) { 
     let meta: ViewMetadata = super.resolve(component); 

     let styles = this._styleService.someMethod(meta); 
    } 
} 

は、私は次のように私のシステムのセットアップに何かを持っていますMyViewResolverの中にthis._styleServiceは注入されていません。現在はundefinedです。 MyStyleServiceも別の注入サービスSomeOtherServiceに依存することに注意してください。そのため、そのプロバイダも定義され、インジェクタで利用可能であることを確認する必要があります。

これらのサービスはすべてブートストラップによって「提供」されていますので、将来は私のサービスの代替バージョンをシステムごとに提供できます。参考のため

これはの角度中核ViewResolverです:あなたはuseFactoryとあなたのクラスを設定しようとすることができ

import {Injectable, ViewMetadata, ComponentMetadata,} from '@angular/core'; 
import {ReflectorReader, reflector} from '../core_private'; 
import {Type, stringify, isBlank, isPresent} from '../src/facade/lang'; 
import {BaseException} from '../src/facade/exceptions'; 
import {Map} from '../src/facade/collection'; 

@Injectable() 
export class ViewResolver { 
    constructor(private _reflector: ReflectorReader = reflector) {} 

    resolve(component: Type): ViewMetadata { 
     ... stuff here ... 
    } 
} 

答えて

2

bootstrap(App, [ 
    MyStyleService, 
    SomeOtherService, 
    { 
    provide: ViewResolver, 
    useFactory: (_reflector: ReflectorReader, styleService: StyleService) => { 
     return MyViewResolver(_reflector, _styleService); 
    }, 
    deps: [ ReflectorReader, StyleService ] 
    } 
]); 

view_resolver.ts(Angular2コア)

+0

ありがとう、これは魅力的な仕事でした。メインのブートストラップされたAppと同じ "プロバイダ"スタックを使用していないが、そのレベルで依存関係を上書きできるので、私の使用にはうまくいきます!再度、感謝します。 – TimS