2016-04-05 8 views
6

OpaqueTokenの提供に関するヘルプが必要です。 Angular 2 beta-12を使用する。プロバイダキーが文字列の場合は正常に動作しますが、OpaqueTokenを使用する場合は機能しません。子クラスでは、SFは未定義です。角度2 OpaqueToken

親クラス:

export let SF = new OpaqueToken('sf'); 

export class A { 
    testMsg: string = 'hello'; 
} 

@Component({ 
    template: `<child></child>`, 
    providers: [ 
    provide(SF, {useValue: A}), 
    provide('justString', {useValue: 'hi'}) 
    ] 
}) 
export class App {} 

子供クラス:

angular2.min.js::私が得る

import {Component, Injector, Inject, OpaqueToken} from 'angular2/core' 
import {SF, A} from './app' 
console.log("******", SF); // undefined 
@Component({ 
    selector: 'child', 
    template: ` 
    $$CHILD Rendered$$ {{a}} 
    ` 
}) 
export class Child { 
    //constructor(@Inject(SF) private a: A) {} // doesn't work 
    constructor(@Inject('justString') private a: string) {} 
} 

例外17EXCEPTION:すべてのパラメータを解決できません。 'Child'(@Inject(undefined))の場合すべてのパラメータがInjectで装飾されているか、有効なタイプの注釈を持っていること、および「Child」が注入可能で装飾されていることを確認してください。 (あなたがこの中には行っていない私はあなたの親と子のクラスは別のファイルであると仮定し、そしてあなたがParentデコレータのdirectivesにそれを置くことができるようにあなたが親ファイルにChildをインポートしていることを

答えて

9

親クラスと子クラスを含むモジュール間に循環的な依存関係があるためです。

不透明なトークンを第3のモジュールに定義し、それを他のモジュールに組み込むと、それが動作します。例えば

定数モジュール:

export let SF = new OpaqueToken('sf'); 

二つの他のモジュールにおいて:

import { SF } from './constants'; 
+0

これははるかに良い作品!ありがとうございました。 http://plnkr.co/edit/7mVEoE – Elijah

1

あなたの例だが、そうでなければChildは全くインスタンス化されないだろうが、明らかにそうではない)。

この場合、子クラスファイルで使用されている親クラスファイルで定義されているものにforwardRefを使用する必要があります。親クラスにインポートされるため、最初に読み込まれる必要があります。 (forwardRefある回避策なし)、その後、ロードされたファイルで定義されたもの

ので、

import {forwardRef} from "angular2/core"; 
... 
constructor(@Inject(forwardRef(()=>SF)) private a: A) {} 

はどこ

constructor(@Inject(SF) private a: A) {} // doesn't work 
動作するはずです

が失敗します。

サイドノート:provide(SF, {useValue: A})ここで、Aはインスタンスではなくクラスへの参照であり、怪しいです。私はあなたが何をしているのか推測しませんが、useValueがインスタンスへの参照で使用され、useClassがクラスへの参照で使用されるのがはるかに一般的であると言います。

+0

感謝を推奨されていません。私が見た事例では一度も言及されていないことは間違いありません。実際、angular.ioのリファレンスドキュメントでは、forwardRefは、同じファイル内のコンポーネントの後にクラスを宣言するときにのみ必要となることについて語っています。注射部位はやや面倒に見えます。ああ。この方法でOpaqueTokensを使用していますか?私の使用例は、グローバルオブジェクトをコンポーネントコンテキストに配置するだけです。 – Elijah