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

时间:2011-09-17 11:27:22

标签: javascript filter views backbone.js

我正在使用Backbone.js呈现具有不同状态的项目列表(电子邮件收件人),例如。确认,待决等。呈现列表后,用户可以选择过滤它们,以便用户可以列出所有收件人,或仅列出已确认的收件人等。物品(收件人)自然地存储在一个集合中..

我的方法是过滤事件:

  1. 清除所有项目的视图
  2. 从应用程序视图中调用集合中的filterOnStatus函数,该函数返回所有模型并将它们添加到视图中。
  3. 第2步工作正常。但是清除集合视图中所有项目的最佳方法是什么。

    在Todo示例应用程序(http://documentcloud.github.com/backbone/examples/todos/index.html)中,他们做了类似的事情。在应用程序视图中,以下代码用于清除列表中的所有已完成项目。

    clearCompleted: function() {
      _.each(Todos.done(), function(todo){ todo.destroy(); });
      return false;
    },
    

    这里的区别在于他们通过删除实际模型来实现这一点。并且该模型的视图侦听它们删除视图的destroy事件。

    我想保留模特。

    解决这个问题的最佳方法是什么。我是否需要在模型中存储对其视图的引用,然后迭代模型并删除视图?

    如果我想过滤模型中的属性,是否有更好的方法?

1 个答案:

答案 0 :(得分:0)

如果您的第一步只是清除所有项目,那么为什么不向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() )
}

当然有更复杂的方法,但是否需要它们取决于你想要实现的目标。根据我的理解,这个简单的方法就足够了。