In effetti, si dovrebbe chiamare decoratori "annotazioni" poiché è leggermente diverso ;-) Consentono di decorare oggetti. Questo post sul blog può fornire ulteriori suggerimenti qui: http://blog.thoughtram.io/angular/2015/05/03/the-difference-between-annotations-and-decorators.html.
Quindi i decoratori non sono qualcosa di specifico per Angular. Esiste una proposta per ES7 e sono supportati anche dal linguaggio TypeScript stesso. Questo può essere usato in congiunzione con la libreria reflect-metadata (è contenuta nel file angular2-polyfills.js
) per impostare e ottenere i metadati per gli elementi.
Classe decoratore
export function MyClassDecorator(value: string) {
return function (target: Function) {
Reflect.defineMetadata("MyClassDecorator", value, target);
}
}
@Component({ ... })
@MyClassDecorator("my metadata")
export class AppComponent {
constructor() {
let decoratorValue: string
= Reflect.getMetadata("MyClassDecorator", this.constructor);
}
}
decoratore Funzione
export function log(target: Object,
propertyKey: string,
descriptor: TypedPropertyDescriptor<any>) {
var originalMethod = descriptor.value;
descriptor.value = function(...args: any[]) {
console.log("The method args are: " + JSON.stringify(args));
var result = originalMethod.apply(this, args);
console.log("The return value is: " + result);
return result;
};
return descriptor;
}
export class AppComponent {
constructor() { }
@MyMethodDecorator
getMessage() {
return 'test';
}
}
Parametro decoratore
export function MyParameterDecorator(param1) {
return function(target: any, methodKey: string | symbol,
parameterIndex: number) {
(...)
};
}
proprietà Class decoratore
export function MyPropertyDecorator(target: any,
propertyKey: string | symbol) {
(...)
}
Quindi, in generale, un decoratore corrisponde a una funzione. Se non è necessario restituire uno wrapping se non si utilizza il parametro. Se si desidera utilizzare i parametri per il decoratore è necessario un ulteriore funzione per ottenere i parametri e restituire il decoratore actualy:
// In the case of a parameter decorator
// myMethod(@MyDecoratorWithoutParameter someParam) { ... }
export function MyDecoratorWithoutParameter(target: any,
propertyKey: string | symbol, parameterIndex: number) {
console.log('decorator called');
}
// myMethod(@MyDecoratorWithParameter('test') someParam) { ... }
export function MyDecoratorWithParameter(param1) {
// param1 contains 'test'
return function(target: any, propertyKey: string | symbol,
parameterIndex: number) {
console.log('decorator called');
};
}
Ecco un plunkr corrispondente ai miei campioni: https://plnkr.co/edit/0VBthTEuIAsHJjn1WaAX?p=preview.
Ecco i link che potrebbero dare maggiori dettagli con dattiloscritto:
Spero che ti aiuta, Thierry
fonte
2016-01-21 13:41:17
Vedi http: // blog.wolksoftware.com/decorators-reflection-javascript-typescript. Anche questa domanda sembra abbastanza simile a http://stackoverflow.com/questions/34465214/access-meta-annotation-inside-class-typescript/34466523 –
Questo è un buon post sul blog. – superluminary