例外:尝试检测脱水检测器的变化

时间:2015-08-05 19:27:53

标签: angular

以下是我的简单自定义指令,它获取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();

我知道这是一个黑客。等待更好的解决方案。

0 个答案:

没有答案