1

因此,我已经与 Backbone 合作了一段时间,没有任何重大问题。虽然我已经阅读了很多关于 Zombie Views 的问题以及它们产生的内存泄漏。经过一些研究,我实现了一种显示视图的方法,希望可以防止这个问题。我目前有两个应用程序使用这种方法,一切似乎都进展顺利,但我想确保这种方法有效。

所有这些函数都在一个名为“App”的主应用程序对象上工作,其中定义了应用程序的命名空间,初始化并启动了应用程序。

首先,我当前的解决方案是这样工作的:当 Backbone 路由器捕获一个 url 时,它会实例化显示该页面所需的所有模型、集合和视图,但路由器不会呈现视图。它所做的只是将视图附加到 App 对象内的“contentView”数组,并使用该App.setAndRenderContentViews函数将页面的呈现也委托给 App。

在 App 对象上,我有两个数组,其中包含当前处于活动状态的所有视图。它们被称为“contentViews”和“appendedViews”。第一个是主视图,它们可能有一些“附加视图”来显示一些模型或集合。这些最后的视图存储在 appendedViews 数组中。

每次路由器调用App.setAndRenderContentViews函数时,应用程序都会运行一系列方法来正确关闭所有“旧视图”,然后渲染新视图。所以,这是我目前使用的代码:

window.App =
  Models: {}
  Collections: {}
  Views: {}
  Routers: {}

  contentViews: []
  appendedViews: []

  setContentViews: (views) ->
    @closeViews() unless @contentViews == []
    @closeAppendedViews() unless @appendedViews == []
    for view in views
      @contentViews.push view
    return @contentViews

  closeViews: ->
    for oldView in @contentViews
      @closeView(oldView)
    @contentViews = []

  closeAppendedViews: ->
    for oldView in @appendedViews
      @closeView(oldView)
    @appendedViews = []

  closeView: (view) =>
    view.unbind()
    view.remove()
    view.model.off unless view.model == undefined
    view.collection.off unless view.collection == undefined

  renderContentView: (view) =>
    $('#content-layout').append(view.render().el)

  renderContentViews: (renderViews) ->
    for view in renderViews
      @renderContentView(view)
    return 1

  setAndRenderContentViews: (views, everybody = false) ->
    if everybody == false
      return Backbone.history.navigate('', trigger: true) unless @session.load().authenticated()
    renderViews = @setContentViews(views)
    @renderContentViews(renderViews)

  pushToAppendedViews: (view) ->
    @appendedViews.push view

我不知道这是否是处理这个问题的好方法。此外,也许有更好的方法来处理僵尸视图。我希望你们中的一个可以帮助我解决这个问题。谢谢!

4

0 回答 0