2015-12-25 14 views
13

Po przypisaniu klasy do metadanych w polu TypeScript, np. aby utworzyć komponent Angular2, czy mogę uzyskać dostęp do metadanych wewnątrz tej klasy?Dostęp do meta-adnotacji wewnątrz klasy (TypeScript)

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

Ogólna odpowiedź brzmi „to zależy”, dekorator jest tylko czymś, co otacza swoją klasę. Możliwe jest, że wyeksponuje propretty lub nie - tak, jak chce. Nie ma _, aby umożliwić ci dostęp do niego - w rzeczywistości może zignorować przekazany do niego parametr. –

Odpowiedz

18

Możesz zobaczyć adnotację/dekorator jako normalne wywołanie funkcji. Do tej funkcji obiekt "Klasa/funkcja" (nie instancja) jest wysyłany w pierwszym parametrze, a parametry (metadane) w drugim argumencie.

Jednak to zależy od implementacji tej funkcji, jeśli coś zostanie dodane np. Do prototypu klasy (zła praktyka/ekspozycja właściwości). Jednak kompilator TypeScript i Angular2 działają inaczej.

Używają one funkcji __decorate i __metadata generowanych przez kompilator TypeScript. Dane zostaną dodane za pomocą funkcji Object.defineProperty(). Pakiet odpowiedzialny za to jest Reflect. (który pod maską używa funkcji Object.defineProperty() w połączeniu z WeakMap).

Funkcja Reflect.defineMetadata() służy do ustawiania adnotacji i do uzyskiwania oczywistych wartości Reflect.getMetadata().

TLDR;

  • Aby uzyskać adnotacje z klasy/składnik angular2 masz używać:

    Reflect.getMetadata('annotations', ComponentClass); //@Component({}), @Pipe({}), ... 
    
  • Aby uzyskać adnotacje z paramaters konstruktora w angular2, trzeba użyć:

    Reflect.getMetadata('parameters', ComponentClass); //@Inject() 
    
  • aby uzyskać adnotacje od nieruchomości w klasie w angular2, trzeba użyć:

    Reflect.getMetadata('propMetadata', ComponentClass); //@HostBinding(), @Input(), ... 
    
Powiązane problemy