因此,我已经与 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
我不知道这是否是处理这个问题的好方法。此外,也许有更好的方法来处理僵尸视图。我希望你们中的一个可以帮助我解决这个问题。谢谢!