2016-04-01 28 views
0

nasıl typescript tasarım çalışmaları i dekoratör gibi yazarsanız,Çağrı typescript dekoratör yöntemi

class foo{ 

    @fooDecorator 
    public fooMethod(){ 

    } 
} 

orada uyarınca

var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { 
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; 
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; 
return c > 3 && r && Object.defineProperty(target, key, r), r; 
}; 
var foo = (function() { 
function foo() { 
} 
foo.prototype.fooMethod = function() { 
}; 
__decorate([ 
    fooDecorator 
], foo.prototype, "fooMethod", null); 
return foo; 
}()); 

olarak transpiled javascript verir gereğince benim app her zaman decorator işlevi çalıştırılan bootperse doppod kodu, ancak fooMethod "fooMethod" altta yatan fonksiyon çalıştırıldığında dekoratör metodu "fooDecorator" yürütülürken, nasıl elde edebilirim, lütfen sorunla bana yardım edin

cevap

1

Bunu böyle yapabilirsiniz. Dekoratörde, orijinal yönteminizi, her seferinde çağrılması gereken ve daha sonra orijinali çağırması gereken, sağlanan yöntemi çağıran 'sarıcı' ile değiştirin.

Sizin dekoratör: Eğer böyle @Foo dekoratör ile süsleyin

export function Foo(funcToCallEveryTime: (...args: any[]) => void) 
{ 
    return (target: any, key: string, descriptor: any) => 
    { 
     var originalMethod = descriptor.value; 

     descriptor.value = function (...args: any[]) { 
      funcToCallEveryTime(...args); 
      return originalMethod.apply(this, args); 
     } 

     return descriptor; 
    } 
} 

Ve yöntemi:

@Foo((...args: any[]) => { console.log("Before method call:", args[0]); }) 
private TestMethod(param: string): void 
{ 
    console.log("Method call"); 
    //... 
} 

Umut bu yardımcı olur

Aşağıdaki kod bu yaklaşımı göstermektedir.

+0

Cevap için thnx, ama dekoratör –

+0

herhangi bir argümana geçmek istemiyorum her zaman dekoratör iç işlevini hardcode yapabilirsiniz ve @Foo() 'gibi dekoratör kullanabilirsiniz. Ama bu kadar esnek olmayacak. – Amid

+0

ama transpiled javascript göre foo uygulaması bootstrapped alır gibi idam edilecek? –