Backbone Zombie View解决方案

时间:2013-02-28 16:55:45

标签: backbone.js

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

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

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

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

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

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

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

0 个答案:

没有答案