木偶中的僵尸景观

时间:2015-02-21 00:50:14

标签: javascript backbone.js marionette

JS控制台错误:

未捕获的ViewDestroyedError:视图(cid:“view351”)已被销毁且无法使用。 backbone.marionette.js体= 1:1715

代码:

initialize: (options) ->
  HWAs = @model.get('homework_assignments')
  @collection = new App.Collections.HomeworkAssignments(HWAs)
  @collection.on "sync", =>
    @render()
  @collection.fetch()

如果我这样做,我会收到僵尸的观点:

  1. 打开使用上述代码的页面
  2. 点击浏览器的后退按钮
  3. 点击指向使用上述代码的视图的链接
  4. 知道为什么会发生这种情况吗?

1 个答案:

答案 0 :(得分:1)

您还没有给我们很多代码可以使用,但这是我最好的猜测。

每次实例化此类的视图时,都会将集合绑定到此视图类。

@collection.on "sync", =>
    @render()

但是,当此类的视图被销毁时,它不会清除绑定到@collection,因为绑定位于collection,而不是view }。因此,现在每次同步集合时,它都会尝试在您自上一页重新加载后创建并绑定到集合的每个视图实例上调用刷新,其中一些显然已经死了。他们可能已经死了,因为你重新渲染了一个父母,一个地区,或其他包含它们的东西,但没有更多的代码,我并不是100%肯定会发生什么事情。

最佳解决方案可能是在您的视图中包含清理功能。

onBeforeClose: () ->
    @collection.off("sync", @render())

您可能还需要将同步功能更改为以下语法:

@collection.on("sync", @render())

我不确定骨干是否会识别一个匿名函数,该函数将@render()称为@render()函数本身的同义词。无论哪种方式,调用@render()函数的匿名函数都会导致不必要的复杂性。