【发布时间】:2021-07-12 17:34:48
【问题描述】:
我有一个 Angular 项目,它使用的服务经常通过典型的 create/read/update/delete/read-list-of-all-entries 重复出现。我也经常想在收到数据后以类似的方式处理收到的数据。所以我编写了使用apply 的装饰器,它以传递给它们的参数确定的方式“转换”数据(参数始终是对象类)。
正常使用时是这样的:
//rule.service.ts
@Injectable({
providedIn: 'root'
})
export class RuleService {
rulesUrl: string = `${Constants.wikiApiUrl}/rule/`;
constructor(private http: HttpClient) {}
@TransformObservable(RuleObject)
getRule(pk: number): Observable<Rule>{
return this.http.get<Rule>(`${this.rulesUrl}/${pk}`);
}
}
这种情况经常发生,所以我想编写一个可以扩展的父服务:
//generic-object.service.ts
@Injectable({
providedIn: 'root'
})
export abstract class GenericObjectService{
baseUrl: string;
constructor(
private http: HttpClient,
public objectClass: any,
) {}
@TransformObservable(this.objectClass) //This line won't work
read(pk: number): Observable<any>{
return this.http.get(`${this.baseUrl}/${pk}`);
}
}
问题是我不能使用“this”作为装饰器参数,它在解析 IIRC 时不存在。但是有没有办法可以以某种方式将装饰器参数传递给我的注入服务,以便装饰器可以使用它?
在下面还可以找到“TransformObservable”装饰器:
export function TransformObservable(modelClass: any){
/**Decorator to apply transformObservableContent */
return function(target: any, propertyKey: string, descriptor: PropertyDescriptor){
const originalMethod = descriptor.value;
descriptor.value = function(){
const observable = originalMethod.apply(this, arguments);
return transformObservableContent(observable, modelClass);
}
return descriptor;
}
}
【问题讨论】:
标签: angular inheritance decorator