修正
感谢朋友令狐虫的指出,《Backbone笔记之一(View) 》的第一个例子里原来漏掉了 initialize 部分,导致view并不能正常显示(后面的例子里都有),可能是复制代码时搞错了。
因为除了在initialize里调用render方法显示以外,还有一种方法是不需要initialize,而是在new出view对象以后调用render方法。
目前原文已更新修正。
补充
也是令狐虫提出的问题:如何在服务端过滤Collection的结果?
如果只是说按特定的条件在浏览器端过滤Collection是很简单的,Collection本身就有这个功能。
以《Backbone笔记之二(Model/Collection) 》中的例子来说,就是这样:
var tl = new TaskList(); tl.fetch(); // 全部显示是这样: tl.each(render_item); // render_item 为渲染显示一条记录的函数 // 过滤部分再显示则是这样(因为where的返回值不是collection,而是array,所以要改用underscore的each): _.each(tl.where({state:"working"}), render_item); // 除了where方法以外,还可以用underscore的filter方法,详见underscore的文档
但是如果全部记录集很大,而过滤后的结果很小的话,这样做就很浪费。因为这是把全部的结果集都下载到浏览器,再过滤出所需的少量数据,一则浪费服务端资源,二则浪费网络资源,最后还浪费浏览器资源,完全没有必要。
这就是令狐提出的那问题了,如何在服务端过滤?
服务端过滤当然也有办法,其实也不太麻烦,就是修改 TaskList 这个Collection类里的url属性,把它改成一个函数:
// ... url: function() { return "/task?filter_state=" + this.filter_state; }, // ...
这样只要修改filter_state就可以修改过滤条件,具体的过滤实现就需要在服务端根据这个参数作处理了。