2016-04-01 3 views
0

В соответствии как машинопись дизайн работы, если я пишу декоратор, как,вызова метод машинописи декоратор, когда основная функция выполняется

class foo{ 

    @fooDecorator 
    public fooMethod(){ 

    } 
} 

это дает transpiled JavaScript как

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; 
}()); 

как на там transpiled code всякий раз, когда мое приложение загружается, функция декоратора выполняется, но как я хочу, всякий раз, когда выполняется базовая функция «fooMethod», метод декоратора «fooDecorator» должен выполняться, как я могу достичь этого, пожалуйста, помогите мне с вопросом

ответ

1

Вы можете сделать это вот так. В декораторе замените ваш оригинальный метод «оберткой», который сначала вызовет метод, который должен быть вызван каждый раз, а затем вызывается исходным.

Приведенные ниже код иллюстрирует этот подход:

Вашего декоратор:

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; 
    } 
} 

И метод вы украсить @foo декоратор, как это:

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

Надеется, что это помогает.

+0

thnx для ответа, но я не хочу передавать какие-либо аргументы декоратору –

+0

вы можете всегда жестко кодировать, что функция внутри декоратора inself и применять декоратор, как '@Foo()'. Но это будет не так гибко. – Amid

+0

, но в соответствии с переполненным javascript foo будет выполняться, как только приложение будет загружено? –

 Смежные вопросы

  • Нет связанных вопросов^_^