当使用*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();
});
}
}
```
答案 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重现您的错误。你有一个能说明问题的傻瓜吗?
答案 3 :(得分:0)
之前我遇到过此异常,这非常意味着您正在使用虚拟内存中不再存在的内容。在我的情况下,我做的几乎和你做的一样。请注意,您正在尝试在超时后访问元素,但是您确定此时间过后,此元素是否存在于内存中?我在该元素上有* ngIf,我在条件为假之后访问它并且它已被删除。