我有一个棱角分明的应用程序,在几个服务中有很多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抛出异常,它们都失败了。我得到,Target
是HttpService
类型。我想这就是我无法访问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
。