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