【问题标题】:What is a dehydrated detector and how am I using one here?什么是脱水检测器,我如何在这里使用它?
【发布时间】:2016-02-19 21:21:28
【问题描述】:

当元素使用*ngIf 处于活动状态时,我正在使用一个简单的指令来聚焦文本输入。这包含在 *ngFor 循环中。

当第一个*ngIf 被激活时,输入按预期聚焦。当另一个输入被激活时,我收到错误:

EXCEPTION: Attempt to use a dehydrated detector.

我不明白这意味着什么以及如何防止错误。即使出现错误,该功能仍然有效。

@Directive({
    selector: '[myAutoFocus]'
})
export class AutoFocusDirective {
    constructor(private elem: ElementRef) {
        window.setTimeout(function() {
            elem.nativeElement.querySelector('input').focus();
        });
    }
}

```

【问题讨论】:

标签: angular


【解决方案1】:

脱水检测器是已从变更检测系统中移除的组件,通常是因为它已被*ngIf 或其他means 从DOM 中卸载: 如果应用程序中有一个异步操作命中了这个已经卸载的检测器,错误是thrown: 解决方案是在受影响的组件上使用[hidden] 而不是*ngIf,或者使用setTimeout( () => this.offendingAction(), 0) 将违规操作推迟到下一个刻度

【讨论】:

  • 谢谢托马斯。花几个小时试图解决这个问题。 setTimeout( () => this.offendingAction(), 0) 完美运行
【解决方案2】:

GitHub 上有一个未解决的问题:https://github.com/angular/angular/issues/6786#issuecomment-185429140

在 beta.2 中,没有抛出异常。在 beta.3-6(4,5 和 6 似乎只是增量没有变化)中,代码被更改为抛出异常。您说得对,这目前不构成问题。

虽然我不知道您收到此错误的确切原因,但我的其中一个帐户来自在角度检查周期中处理组件,它会更新视图。其他人已经在 github 线程上记录了他们的问题。

【讨论】:

    【解决方案3】:

    “脱水检测器”是指该组件/指令的变化检测器不再脱水。 (抱歉,我无法抗拒——我也不知道这个错误是什么意思,也不知道“水合”或“脱水”应该表达什么。)

    这个source file 说:

    /**
     * Thrown when change detector executes on dehydrated view.
     *
     * This error indicates a bug in the framework.
     *
     * This is an internal Angular error.
     */
    export class DehydratedException extends BaseException {
      constructor(details: string) { super(`Attempt to use a dehydrated detector: ${details}`); }
    }
    

    所以你可能发现了一个内部 Angular 错误。

    我无法通过此simple plunker 重现您的错误。你有显示问题的插件吗?

    另见https://github.com/angular/angular/issues/6786

    【讨论】:

    • 我似乎无法重现 Plunker 中的错误。我正在使用 Ionic 2,所以我认为这与此有关。
    【解决方案4】:

    我之前遇到过这个异常,这在很大程度上意味着您正在使用虚拟内存中不再存在的东西。就我而言,我做的几乎和你做的一样。请注意,您正在尝试在超时后访问一个元素,但您确定该元素在此时间过去后存在于内存中吗?我在那个元素上有 *ngIf 并且我在条件为假并且它已经被删除之后访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      相关资源
      最近更新 更多