如何在角度可注射服务

时间:2017-08-01 06:01:16

标签: angular decorator

我想使用AOP'在我的angular2服务中,例如,我想请求我的服务器并获取数据,我将检查它返回代码,我将通过此返回代码显示消息,

例如: 这是我的服务:

@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是我的角度2 http包装器,用于某些自定义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), <

1 个答案:

答案 0 :(得分:2)

你传递错误的背景。

根据documentation

  

方法装饰器的表达式将作为函数调用   在运行时,使用以下三个参数:

1)静态成员的类的构造函数,或实例成员的类的原型。

2)..

所以target在您的情况下是TemplatesService.prototype,但您应该使用当前实例调用方法。

尝试以下

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