什么是脱水检测器?我如何在这里使用?

时间:2016-02-19 21:21:28

标签: angular

当使用*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();
        });
    }
}

```

4 个答案:

答案 0 :(得分:13)

脱水检测器是已从更改检测系统中删除的组件,通常是因为它已通过*ngIf或其他means从DOM卸载: 如果应用程序中存在异步操作,则会触发此已卸载的检测器,错误为thrown: 解决方案是在受影响的组件上使用[hidden]而不是*ngIf,或者使用setTimeout( () => this.offendingAction(), 0)

将违规操作推迟到下一个时间段

答案 1 :(得分:1)

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

在beta.2中,没有抛出任何异常。在beta.3-6(4,5和6似乎只是增量而没有变化),代码被更改为抛出异常。你是对的,这当前不会造成问题。

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

答案 2 :(得分:0)

“脱水检测器”意味着该组件/指令的变化检测器不再水合。 (对不起,我无法抗拒 - 我不知道这个错误意味着什么,也不知道“水合”或“脱水”应该传达什么。)

source file说:

SELECT * 
FROM YourTable AS tbl
WHERE tbl.Amnt = (SELECT MIN(Amnt) FROM YourTable Where YourTable.Item = tbl.Item);

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

我无法使用此simple plunker重现您的错误。你有一个能说明问题的傻瓜吗?

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

答案 3 :(得分:0)

之前我遇到过此异常,这非常意味着您正在使用虚拟内存中不再存在的内容。在我的情况下,我做的几乎和你做的一样。请注意,您正在尝试在超时后访问元素,但是您确定此时间过后,此元素是否存在于内存中?我在该元素上有* ngIf,我在条件为假之后访问它并且它已被删除。