2017-08-01 17 views
1

私のangular2サービスで 'AOP'を使用する場合は、例えば私のサーバーをリクエストしてデータを取得したい場合、コードを返すかどうかチェックします。この戻りコード、例えば角度注入サービスでカスタムデコレータを使用する方法

:ここ は私のサービスです。

@Injectable() 
export class TemplatesService { 

constructor(private http: HttpHelper) { 

} 

@show_message 
public templates(search_params = {}): Observable<Array<Template>> { 
    let params = new URLSearchParams() 
    for (let key in search_params) { 
     params.set(key, search_params[key]) 
    } 
    return this.http.AUTH_HTTP_GET('api/templates.json?per=10000', params).map(data=> this.http.extractData(data).templates) 
} 
} 

HttpHelperは、いくつかのカスタムHTTPヘッダー、ボディなどのための私の角2のhttpラッパー..です

show_messageデコレータ:

export function show_message(target:any,key:any,descriptor:any){ 
    console.log(target,key ,descriptor) 
    const method = descriptor.value 

    descriptor.value = (...args:any[]) => { 

     let ret = method.apply(target, args); 

     return ret; 
    } 

    console.log(method) 

    return descriptor; 
} 

、ここでエラーです:

VM40526 TemplateIndexComponent_Host.ngfactory.js:5 
ERROR TypeError: Cannot read property 'AUTH_HTTP_GET' of undefined 
     at Object.TemplatesService.templates (eval at <anonymous> (app.cfb7cea….js:194), <anonymous>:31:25) 
     at TemplatesService.descriptor.value [as templates] (eval at <anonymous> (app.cfb7cea….js:2349), < 

答えて

2

あなたは間違ったコンテキストを渡しています。 documentation

The expression for the method decorator will be called as a function at runtime, with the following three arguments:

1)静的メンバのクラスのコンストラクタ関数、またはインスタンスメンバーのクラスのプロトタイプのいずれかによる

2)..

だからtargetは、あなたのケースでTemplatesService.prototypeですが、現在のインスタンスでメソッドを呼び出す必要があります。

は、以下の

descriptor.value = function(...args:any[]) { // don't forget function 
    let ret = method.apply(this, args); // pass current context 
+0

良いを試してみてください!素敵な答えは、ありがとう! – junk

関連する問題