Backbone笔记之四(修正与补充)

修正

感谢朋友令狐虫的指出,《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就可以修改过滤条件,具体的过滤实现就需要在服务端根据这个参数作处理了。

推送到[go4pro.org]