将Backbone模型从集合传递到新视图可将集合保存在内存中

时间:2014-03-05 13:45:47

标签: backbone.js marionette

我有一个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

2 个答案:

答案 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

新模型是一个全新的对象,然后与当前视图/模型/控制器无关。