Javascript Backbone.js:清除所有视图的最佳方法
我正在使用Backbone.js呈现具有不同状态的项目(电子邮件收件人)列表,例如已确认、待定等。呈现列表后,用户可以选择对其进行筛选,以便用户可以列出所有收件人,或仅列出已确认的收件人,依此类推。项目(收件人)自然存储在集合中 我的方法是在过滤器事件上:Javascript Backbone.js:清除所有视图的最佳方法,javascript,filter,views,backbone.js,Javascript,Filter,Views,Backbone.js,我正在使用Backbone.js呈现具有不同状态的项目(电子邮件收件人)列表,例如已确认、待定等。呈现列表后,用户可以选择对其进行筛选,以便用户可以列出所有收件人,或仅列出已确认的收件人,依此类推。项目(收件人)自然存储在集合中 我的方法是在过滤器事件上: 清除所有项目视图的 从应用程序视图调用集合中的filterOnStatus函数,该函数返回所有模型并将它们添加到视图中 第二步很好。但清除集合视图中所有项目的最佳方法是什么 在Todo示例应用程序()中,它们执行类似的操作。在应用程序视图中,
clearCompleted: function() {
_.each(Todos.done(), function(todo){ todo.destroy(); });
return false;
},
这里的区别在于,它们通过删除实际模型来实现这一点。该模型的视图会侦听销毁事件,从而删除该视图
我想保留这个模型
解决这个问题的最好办法是什么。我是否需要在模型中存储对其视图的引用,然后迭代模型并删除视图
如果我想过滤模型中的属性,有没有更好的方法?如果您的第一步只是清除所有的项,那么为什么不向AppView添加一个简单的方法来实现这一点,比如:
clearList:function(){this.$('.list').html('')
甚至更好的是,您可以过滤所有模型并将它们渲染到临时元素,而不是用它替换当前列表。因此,所有的过滤将只在一个DOM调用中完成(DOM很慢)。jQuery的示例:
AppView.filterOnStatus = function() {
var $fragment = $('<div/>')
// filter your collection and append rendered views to $fragment
this.$('.list').html( $fragment.html() )
}
AppView.filternostatus=函数(){
变量$fragment=$('')
//筛选集合并将渲染视图附加到$fragment
这是.$('.list').html($fragment.html())
}
当然还有更复杂的方法,但是你是否需要它们取决于你想要达到的目标。据我所知,这种简单的方法已经足够了。但是通过这种方法,我失去了对视图的跟踪(每个列表项都是一个视图)。不?你说的失去轨道到底是什么意思?你为什么要保留它?我指的是视图对象,记忆方面的。我没有调用view.remove();在上面。但是你说从DOM中删除DOM表示会自动删除主干视图?我一点也没想到。据我所知,如果没有对视图的引用,那么视图的对象将被垃圾收集器删除,而这与DOM无关。可以看到,在前面提到的todos示例中,
.remove()
只是从DOM中删除视图表示。从我3年的前端开发经验来看,我认为在这种情况下,你根本不应该考虑内存。当然我可能是错的,但我认为这值得单独调查。