我如何确定 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 员工有所帮助。
您恰当地提到了两种破坏视图的方法。
在您的视图上调用 this.destroy()
。 .destroy()
方法做了几件重要的事情: 1. 设置 view.isDestroyed
位以便 Marionette 可以 知道 您的视图已从 DOM;通过调用最终调用 view.$el.remove()
的 view.remove()
从 DOM 和附加到它的大多数绑定中删除视图,并删除 view.$el.remove()
没有的其他绑定(如 Marionette ui
个元素和 behaviors
).
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=]
当我在 marionette 视图上调用 destroy 并稍后尝试使用它时,会抛出一个错误,指出它已被销毁。此外,当我直接从 DOM 中删除视图时,它也会引发相同的错误。所以我需要知道如何确定视图已被破坏。
您可以使用视图的 isDestroyed
属性.
// Example
if (view.isDestroyed) {
view = new View({});
}
view.doSomething();
所以 @JonathanMiles
是正确的,但我认为一些详细说明可能会对您和我们的 Google 员工有所帮助。
您恰当地提到了两种破坏视图的方法。
在您的视图上调用
this.destroy()
。.destroy()
方法做了几件重要的事情: 1. 设置view.isDestroyed
位以便 Marionette 可以 知道 您的视图已从 DOM;通过调用最终调用view.$el.remove()
的view.remove()
从 DOM 和附加到它的大多数绑定中删除视图,并删除view.$el.remove()
没有的其他绑定(如 Marionetteui
个元素和behaviors
).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=]