2015-12-25 7 views
13

メタデータでクラスに注釈を付けると、 Angular2コンポーネントを作成するには、そのクラス内のメタデータにアクセスできますか?クラス内のメタ注​​釈にアクセスする(タイプスクリプト)

import {Component} from 'angular2/core'; 

@Component({ 
    selector: 'app', 
    templateUrl: '/app/components/app/app.component.html' 
}) 
export class AppComponent { 

    // can I access 'templateUrl' from above annotation here? 

} 
+0

一般的な答えは、「それが依存」であるデコレータは、あなたのクラスをラップだけのものです。それは、それが選択するようにproprertyを公開することも、公開しないことも可能です。実際にアクセスできるようにする必要はありません。実際に渡されたパラメータを無視することもできます。 –

答えて

18

通常の関数呼び出しとして注釈/デコレータを見ることができます。この関数に、 'Class/Function'オブジェクト(インスタンスではない)が第1引数で送信され、パラメータ(メタデータ)が第2引数で送信されます。

しかし、クラスのプロトタイプに何かが追加された場合(悪い練習/公開プロパティ)、その関数の実装に依存します。 TypeScriptコンパイラとAngular2は、それとは異なる方法で動作します。

これらは、TypeScriptコンパイラによって生成される__decorateとの関数を使用します。データはObject.defineProperty()機能で追加されます。これを担当するパッケージはReflectです。 (フードの下での機能をWeakMapと組み合わせて使用​​します)。

機能Reflect.defineMetadata()は、注釈を設定し、明白なReflect.getMetadata()を得るために使用されます。

TLDR;

  • angular2でクラス/コンポーネントから注釈を取得するには、使用する を持っている:

    Reflect.getMetadata('annotations', ComponentClass); //@Component({}), @Pipe({}), ... 
    
  • angular2でコンストラクタPARAMATERSから注釈を取得するには、使用する必要があります。

    Reflect.getMetadata('parameters', ComponentClass); //@Inject() 
    
  • あなたが使用する必要が 、angular2でクラスのプロパティから注釈を取得するには:

    Reflect.getMetadata('propMetadata', ComponentClass); //@HostBinding(), @Input(), ...