指令可能在多种情况下断开连接:

AsyncDirective 断开连接时,它们的 disconnected 回调会被调用。异步指令应该实现 disconnected 来取消订阅异步回调,以便指令可以被垃圾回收。在内部,指令持有对其关联的底层 DOM 的引用,因此未能取消订阅已断开连接的指令可能导致内存泄漏。

添加一个停止定时器的方法:

ensureTimerStopped() {
clearInterval(this.timer);
this.timer = undefined;
}

添加 disconnected 回调,并调用我们的 ensureStopped() 回调,因为我们不希望在指令不再使用时继续运行:

disconnected() {
this.ensureTimerStopped();
}

最后,实现 reconnected 回调。

如果一个指令实例已断开连接,当它渲染到的 DOM 随后重新连接时,该实例有可能重新连接。这可能发生在 DOM 被移除并缓存以供后续使用时,或者当宿主元素被移动导致断开连接和重新连接时。

这里,我们将使用我们的 ensureTimerStarted 方法重新启动定时器:

reconnected() {
this.ensureTimerStarted();
}

在实现 disconnected 之后,始终要实现 reconnected

根据经验,如果你实现了 disconnected 来停止某些异步工作,你应该始终实现 reconnected 来将指令恢复到工作状态。