基于编辑3 here我实现了该解决方案。但是,在每个组件中进行主题初始化和“清理”ngOnDestroy仍然很痛苦。我认为它可以传递给装饰者,例如。基于此post:angular2/rxjs ngUnsubscribe:如何退订所有与装饰订阅?
export function AutoUnsubscribe(constructor) {
const original = constructor.prototype.ngOnDestroy;
constructor.prototype.ngUnsubscribe = new Subject<void>();
constructor.prototype.ngOnDestroy = function() {
constructor.prototype.ngUnsubscribe.next();
constructor.prototype.ngUnsubscribe.complete();
original && typeof original === "function" && original.apply(this, arguments);
};
}
用法与其他类装饰器一样。它运行良好,但我不得不在使用类型系统时,像这样:takeUntil((this as any).ngUnsubscribe)
。
属性ngUnsubscribe无法识别组件中的类型系统。有什么方法可以告诉类型系统该属性是否存在或将会存在?
如果这样做可能会很容易使用这个@AutoUnsubscribe装饰器:只需装饰一个类,并在每次订阅前放置takeUntil(this.ngUnsubscribe)。不知道如果我们可以做得更好,只是装饰一个类,并自动地这个装饰器将在每次订阅我们之前将takeUntil(this.ngUnsubscribe)。
我目前的解决方法是使用BaseComponent与ngUnsubscribe道具。并扩展每个调用订阅的组件。
发现这很难:如果在编译时ngOnDestroy在组件上不存在,ng buld --prod --aot会优化掉任何对ngOnDestroy的调用,即使该方法在运行时可用。解决方案:使用@AutoUnsubscribe时始终有一个ngOnDestroy,即使它是空的 –