通过decorator重写主题的.next方法



我有一个棱角分明的应用程序,在几个服务中有很多Subjects/BehaviorSubjects/ReplaySubjects作为属性。我目前正在尝试创建一个typescript装饰器,我可以添加到一些主题中,以获得一些";额外的";调用此主题的.next函数时的功能(手动调用全局更改检测..(但目前我还没有成功,因为我从来没有接触过主题的实例。。

@Injectable({
providedIn: 'root',
})
export class MyService extends HttpService {
@TriggerGlobalChangeDetection
public mySubject$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
}

装饰器的内容.ts:

// export function TriggerGlobalChangeDetection(): (Target: any, propertyKey: string) => {
//     const origNext = Target.prototype.next;
//     Target.prototype.next = function () {
//         console.log('overriding next');
//         origNext.apply(this);
//         GlobalChangeDetectionService.detectChanges();
//     };
// };
export function TriggerGlobalChangeDetection(
target?: any,
propertyName?: string,
descriptor?: PropertyDescriptor
) {
const origNext = target.prototype.next;
console.log('overriding next');
origNext.apply(this);
GlobalChangeDetectionService.detectChanges();
}
// export const TriggerGlobalChangeDetection = (Target: any, p: string): any => {
//     return class extends Target {
//         next = (value: any): void => {
//             super.next(value);
//             GlobalChangeDetectionService.detectChanges();
//         };
//     };
// };

正如您所看到的,我尝试了装饰器的不同实现。。。但是由于CCD_ 1抛出异常,它们都失败了。我得到,TargetHttpService类型。我想这就是我无法访问mySubject$的原因

有人知道如何像我所尝试的那样发挥作用吗?

亲切问候Simon

你可以试试这样的东西;

export class SomeService {

private _mySubject$ = new BehaviorSubject<Boolean>(false);
get _mySubject(): Observable<Boolean> {
return this._mySubject$;
}
//.... either in constructor or function etc. 
if (some condition = true) {
this._mySubject$.next(true);
} else {
this._mySubject$.next(false);
}

然后,您可以在其他组件或需要的地方使用SomeService._mySubject

最新更新