我有一个CompositeView,它显示了我从服务器请求的模型列表,类似于(在CoffeeScript中):
class List.Stories extends Marionette.CompositeView
template: "stories-list-body"
itemView: List.Story
itemViewContainer: "#stories-list"
class List.Story extends Marionette.ItemView
template: "stories-list-story"
triggers:
"click .js-show-button": "show:button:clicked"
正确创建视图,将集合作为构造函数的参数传递,我可以看到元素,当我单击按钮时,它会触发相应的事件并对其进行处理。问题是,当处理程序创建一个显示模型并关闭旧模型的新视图时,仍会在model.collection
中引用该集合占用一些内存。
消除此参考的正确方法是什么?在更换视图之前,只需在处理程序中使用delete model.collection
?
答案 0 :(得分:1)
尝试做类似
的事情var model = myCollection.remove(viewModel, { silent: true })
// create new view using `model`
在上面的示例中,viewModel
将引用视图的模型(因此视图中的this.model
)。
通过从集合中删除模型,它应该被垃圾收集(假设它没有被其他地方引用......)。
答案 1 :(得分:0)
如果一切都发生在同一个控制器中,即控制器仍处于打开状态并且将负责该事件并且不会触发Application.vent,我认为如果内存泄漏不会很大,这种情况是可以接受的。原因是控制器将最终关闭,所以不需要匆忙。
如果会触发应用级别的通风/请求/命令,您需要认真对待。假设您在控制器中有这样的代码:
@listenTo storiesView, 'itemview:show:button:clicked', (itemView) ->
App.vent.trigger 'show:another:view:with:this:model', itemView.model
停在这里。该模型是旧模型,不会被垃圾收集。
我将使用下面的代码:
@listenTo storiesView, 'itemview:show:button:clicked', (itemView) ->
model = _.clone itemView.model
App.vent.trigger 'show:another:view:with:this:model', model
新模型是一个全新的对象,然后与当前视图/模型/控制器无关。