Javascript Backbone.js:清除所有视图的最佳方法

Javascript Backbone.js:清除所有视图的最佳方法,javascript,filter,views,backbone.js,Javascript,Filter,Views,Backbone.js,我正在使用Backbone.js呈现具有不同状态的项目(电子邮件收件人)列表,例如已确认、待定等。呈现列表后,用户可以选择对其进行筛选,以便用户可以列出所有收件人,或仅列出已确认的收件人,依此类推。项目(收件人)自然存储在集合中 我的方法是在过滤器事件上: 清除所有项目视图的 从应用程序视图调用集合中的filterOnStatus函数,该函数返回所有模型并将它们添加到视图中 第二步很好。但清除集合视图中所有项目的最佳方法是什么 在Todo示例应用程序()中,它们执行类似的操作。在应用程序视图中,

我正在使用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年的前端开发经验来看,我认为在这种情况下,你根本不应该考虑内存。当然我可能是错的,但我认为这值得单独调查。