我如何确定 marionette 视图已被完全破坏?

How can i be sure a marionette view has been totally destroyed?

当我在 marionette 视图上调用 destroy 并稍后尝试使用它时,会抛出一个错误,指出它已被销毁。此外,当我直接从 DOM 中删除视图时,它也会引发相同的错误。所以我需要知道如何确定视图已被破坏。

您可以使用视图的 isDestroyed 属性.

检查视图是否已被销毁
// Example
if (view.isDestroyed) {
    view = new View({});
}
view.doSomething();

所以 @JonathanMiles 是正确的,但我认为一些详细说明可能会对您和我们的 Google 员工有所帮助。

您恰当地提到了两种破坏视图的方法。

  1. 在您的视图上调用 this.destroy().destroy() 方法做了几件重要的事情: 1. 设置 view.isDestroyed 位以便 Marionette 可以 知道 您的视图已从 DOM;通过调用最终调用 view.$el.remove()view.remove() 从 DOM 和附加到它的大多数绑定中删除视图,并删除 view.$el.remove() 没有的其他绑定(如 Marionette ui 个元素和 behaviors).

  2. Simpy 根据您的观点做 this.$el.remove()。这将从 DOM 中删除与视图关联的 HTML 以及绑定到该 HTML 的事件,但不会删除在缓存的 HTML 元素上创建的事件。

现在,提到第一个,显然 Marionette 将知道视图已被销毁。如果您需要知道视图是否被销毁,就像 @JonathanMiles 指出的那样,只需获取对您的视图的引用并检查 view.isDestroyed 的值。

但是,如果您决定自己从 DOM 中删除视图 HTML,Marionette 将 不知道该视图是否不在 DOM。你可能会遇到错误,特别是因为你可能仍然有事件绑定到一个没有 HTML 关联的视图(尽管大多数这些情况可能只是悄悄地过去而不被注意),但不是来自 Marionette。更糟糕的是,您可能决定要替换被拒绝的视图,您将生成新的视图。然而,旧的视图实例仍然存在。虽然不会有僵尸事件,但这是一个潜在的内存泄漏。

故事的寓意是不要简单地做 view.$el.remove()。使用 Marionette 的 view.destroy() 完全释放视图对象以进行垃圾回收,如果视图 .isDestroyed.[= 则可以利用 知道 25=]