问题描述
我正在 angular/typescript 中创建一个自定义装饰器:@feature(featureName) 它将输入作为 featureName 的字符串并调用服务以检查该功能是否已启用。
我无法将服务注入到装饰器中,因此使用了各种方法。任何可能的解决方案? feature.decorator.ts
// eslint-disable-next-line @typescript-eslint/ban-types
export function feature(flag: string) {
return function (target: Object,key: string | symbol) {
Object.defineProperty(target,key,{
configurable: false,enumerable: false,get: () => {
return 'newValue';
},set: () => {
return 'new value';
}
})
}
}
我的服务是单例服务:
import { BehaviorSubject,Observable } from 'rxjs';
import { BaseAPIService } from '../../services/base-api.service';
import { FEATURE } from './features-list.constants';
import { Injectable } from '@angular/core';
import { map } from 'rxjs/operators';
export interface FeatureStatus {
feature: string;
status: boolean;
}
@Injectable({ providedIn: 'root' })
export class FeatureManagerService {
private _featureStatuses: FeatureStatus[];
areFlagsAvailable$: BehaviorSubject<boolean> = new BehaviorSubject(false);
constructor(private httpService: BaseAPIService) {}
loadFeatureFlags(): Observable<boolean> {
return this.fetchFeatureStatus().pipe(
map((featureStatuses: FeatureStatus[]) => {
console.log("FMS first");
this._featureStatuses = featureStatuses;
features = featureStatuses;
this.areFlagsAvailable$.next(true);
return true;
})
);
}
fetchFeatureStatus(): Observable<FeatureStatus[]> {
const features = [];
for (const feature of Object.keys(FEATURE)) {
features.push(feature);
}
return this.httpService.post(`/api/feature-flag`,features);
}
isFeatureEnabled(featureName: string): boolean {
return this._featureStatuses.filter((featureStatus) => {
return featureStatus.feature === featureName;
})[0].status;
}
}
解决方法
你的代码有点模糊。据我了解,将服务放入构造函数时会出错,所以这是我的解决方案
@Inject(BaseAPIService private httpService: any
希望这会有所帮助