2017-08-01 1 views
1

Je veux utiliser 'AOP' dans mon service angular2, par exemple, je veux demander mon serveur et obtenir des données, et je vais vérifier le code de retour, je vais montrer le message par ce code de retour,Comment utiliser le décorateur personnalisé dans le service injectable angulaire

par exemple: voici mon service:

@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 est mon emballage angulaire 2 http pour certains en-tête HTTP personnalisé, le corps etc ..

le décorateur 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; 
} 

et voici l'erreur:

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), < 

Répondre

2

vous passez contexte mal.

Selon le membre documentation

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

1) Soit la fonction de constructeur de la classe d'un élément statique, ou le prototype de la classe d'une instance.

2) ..

Alors target est TemplatesService.prototype dans votre cas, mais vous devez appeler la méthode avec l'instance en cours.

Effectuez les opérations suivantes

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

bon! belle réponse, merci! – junk