我如何确定木偶视图已被彻底摧毁?

Ogi*_*ado 2 backbone.js marionette

当我在木偶视图上调用destroy并稍后尝试使用它时会抛出一个错误,说它已被破坏.此外,当我直接从DOM中删除视图时,它也会抛出相同的错误.所以我需要知道我怎么能确定视图被破坏了.

Jon*_*les 6

您可以使用视图的isDestroyed属性检查视图是否已被销毁.

// Example
if (view.isDestroyed) {
    view = new View({});
}
view.doSomething();
Run Code Online (Sandbox Code Playgroud)


see*_*uit 5

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

您恰如其分地提到了两种可能会破坏视图的方法.

  1. 请致电this.destroy()您的观点.该.destroy()方法做了几件至关重要的事情:1.设置view.isDestroyed位以便Marionette可以知道您的视图已从DOM中删除; 通过调用view.remove()最终调用的方法从DOM中删除视图以及附加到它的大多数绑定view.$el.remove(),并删除其他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().用木偶的view.destroy(),以完全免费的垃圾收集视图对象,并收获的好处知道如果视图.isDestroyed.