0

のプロトタイプチェーン上のメタデータを返しません。私は "MyCustom"として親クラスを持っています。反映-メタデータReflect.getMetadata()メソッドは、私が反映-メタデータ0.1.2を使用していたオブジェクト

export class MyCustom {} 

私の「ホーム」コンポーネントクラスは、この「MyCustom」クラスを拡張します。

@Component({ 
    selector: 'home', 
    templateUrl: './app/components/home/home.html', 
    styleUrls: ['./app/components/home/home.css'] 
}) 
export class Home extends MyCustom { 
} 

私の意図は、次のメソッド呼び出しを使用して "MyCustom"クラスを拡張するすべてのクラスのメタデータを取得することです。

let annotations = Reflect.getMetadata('annotations', MyCustom); 

方法Reflect.getMetadataのコメント()と言い、

ターゲット オブジェクトまたはそのプロトタイプチェーンに設けられたメタデータキーのメタデータ値を取得します。

は、しかし、私は何を取得します。以下のように「MyCustom」クラスに@Componentを追加すると、「MyCustom」の注釈である結果が1つ表示されます。

は、なぜ私はサブクラスに注釈を得ていないのですか?どんな助けも高く評価されます。

答えて

1

メタデータはMyCustomためHomeないために保存され、継承がここには効果がありません。

おそらくできることは、親クラスのメタデータを追加して、必要な値を持つComponentデコレータを呼び出す独自のデコレータを持つことです。
何かのように:

function MyComponent(props: any) { 
    return (ctor) => { 
     Reflect.defineMetadata('annotations', ctor.prototype.name, ctor.prototype); 
     return Component(props)(ctor); 
    } 
} 

@MyComponent({ 
    selector: 'home', 
    templateUrl: './app/components/home/home.html', 
    styleUrls: ['./app/components/home/home.css'] 
}) 
class Home extends MyCustom {} 

私はそれをテストしていない、と前に似た何かを行っていないが、それはおそらく動作するはずです。


なぜ「レジストリ」を使用しないのですか?
はこのような何かがいる:

class Home extends MyCustom { 
    ... 
} 

REGISTRY["home"] = Home; 

レジストリをとコンポーネントは、あなた限り、同じファイルである必要はありません。

const REGISTRY: { [name: string]: MyCustom } = {}; 

その後に、それぞれのそのようなコンポーネントのためにそれを登録します必要に応じてインポートしてください。

は、その後、あなたの主成分から、それは、これらのコンポーネントのすべてを持っていることは簡単です。

+0

お返事ありがとうございます。私はこれを使用してこれを稼働させようとしましたが、今まで運がありませんでした。私がしようとしていることの完全な概要を教えてください。私の主なアプリケーションは、最初はサブコンポーネント(基本的にはタブ)を知らない。カスタム注釈を使用してサブコンポーネントに注釈を付けることを試みており、それらを主コンポーネントからスキャンして追加します。 –

+0

注釈をスキャンする方法は、ターゲットオブジェクトを必要とするReflect.getMetadata()でした。だから私は "MyCustom"としてスーパークラスを使用しようとしていて、私のサブコンポーネントでそれを拡張しようとしていたのです。 (その時点で私はReflectを望んでいた。getMetadata( '注釈'、MyCustom);サブクラスのアノテーションも返されます) –

関連する問題