以下是我的简单自定义指令,它获取jsonp资产并显示它。
@Directive({ selector: 'cms', viewInjector: [httpInjectables],
properties:['assets'],
lifecycle:[LifecycleEvent.onDestroy]
})
// We inherit from the default RouterOutlet
export class cms {
$elemRef: any;
subscription:any;
jsonpRequest:any;
constructor(ngEl: ElementRef, jsonp:Jsonp ) {
this.$elemRef = $(ngEl.nativeElement);
this.jsonpRequest= jsonp.get("https://www.host.com?id=assetId&callback=JSONP_CALLBACK").toRx();
this.jsonpRequest.subscribe(function(data){
$(ngEl.nativeElement).html(data._body.assetID);
});
}
onDestroy(){
this.jsonpRequest.dispose();
}
}
在处理请求的某个时刻,我使用 appRef.dispose()销毁引导的应用程序。 我在请求完成时遇到以下异常:
EXCEPTION: Attempt to detect changes on a dehydrated detector.
似乎更改检测是在已处置应用的JSONP回调上触发的。由于app不存在(或脱水)异常被抛出(我猜)。
我在调用dispose之前使用了更改Detector Ref 的分离功能,希望不会为此应用及其子指令(我的指令在此处)触发更改检测。 但我想我在某处非常错误。
有人可以解释如何解决这个问题吗?
TL; DR: 如果处置了app并且执行了挂起的回调,我该怎么做才能避免DehydratedException?
修改 我在处理组件本身之前强行分离组件及其主机容器,暂时解决了这个问题。例如:
@Inject(ChangeDetectorRef)
class baseComponent{
cd: ChangeDetectorRef;
constructor(cd:ChangeDetectorRef){
this.cd=cd;
}
forceDetach(){
this.cd._cd.parent.mode=DETACHED;
this.cd.detach();
}
}
并且正在做:
appRef.hostComponent.forceDetach();
appRef.dispose();
我知道这是一个黑客。等待更好的解决方案。