- 前言
- 第一章 Hello Backbone.js
- 第二章 Backbone.js 中的 Model 实践
- 第三章 Backbonejs 中的 Collections 实践
- 第四章 Backbonejs 中的 Router 实践
- 第五章 Backbonejs 中的 View 实践
- 第六章 实战演练:todos 分析(一)
- 第七章 实战演练:todos 分析(二)View 的应用
- 第八章 实战演练:todos 分析(三)总结
- 第九章 后端环境搭建:web.py 的使用
- 第十章 实战演练:扩展 todos 到 Server 端(backbonejs+webpy)
- 第十一章 前后端实战演练:Web聊天室 - 功能分析
- 第十二章 前后端实战演练:Web聊天室 - 详细设计
- 第十三章 前后端实战演练:Web聊天室 - 服务器端开发
- 第十四章 前后端实战演练:Web聊天室 - 前端开发
- 第十五章 引入 require.js
- 第十六章 补充异常处理
- 第十七章 定制 Backbone.js
- 第十八章 再次总结的说
- Backbonejs 相关资源
第十七章 定制 Backbone.js
这里说的定制Backbonejs,主要是定制Backbone中的sync部分,也就是最后和服务器端通信的部分。
17.1 三个级别的定制
首先得说,在Backbone里面和后端能通信的对象也就两个------Model和Collection。这俩的主要工作就是从服务器拉取数据,保存到实例中,或者把实例中的属性发送到服务器端。
上面两中类型的对象都是基于Backbone.sync来进行通信的,同时也可以定义各自的sync方法,类似这样:
Model级别的
var Message = Backbone.Model.extend({
urlRoot: '/message',
// 这么写, 打印要操作的实体, 调用系统的sync
sync: function(method, model, options){
console.log(model);
return Backbone.sync(method, model, options);
},
});
Collection级别的
var Messages = Backbone.Collection.extend({
url: '/message',
model: Message,
// 这么写, 打印要操作的实体, 调用系统的sync
sync: function(method, collection, options){
console.log(collection);
return Backbone.sync(method, collection, options);
},
});
当然,也会存在这样的需求,要修改全局的sync:
var old_sync = Backbone.sync;
Backbone.sync = function(method, model, options) {
console.log(model);
return old_sync(method, model, options);
}
所谓定制,是Backbonejs给开发者提供的可以被重写的接口。因此定制过程也得符合Backbone对sync的定义。
17.2 简单实例,用socketio通信
在 wechat 这个项目中为了保证聊天的实时性,我引入了socketio,后端使用gevent-socketio,(socketio这个东西不打算写,和主题关系不大,有需求的可以题issue)。
实时聊天的需求主要是在Message上,用户A发送一个请求,在同一聊天室内的其他用户应该立马能看见。之前有两个版本:
第一版是发送message时会调用messages的fetch方法,也就是用户只有发言才能看到别人发的聊天内容,代码如下:
message.save(null, {
success: function(model, response, options){ comment_box.val(''); // 重新获取,看服务器端是否有更新 // 比较丑陋的更新机制 messages.fetch({ data: {topic_id: topic_id}, success: function(){ self.message_list.scrollTop(self.message_list_div.scrollHeight); messages.add(response); }, }); },
});
第二版是引入socketio之后,在save完数据之后,通过socket把数据再次发送到服务器上的socket端,服务器再挨个发送数据到各个客户端,代码如下:
message.save(null, {
success: function(model, response, options){ comment_box.val(''); messages.add(response); // 发送成功之后,通过socket再次发送 // FIXME: 最后可通过socket直接通信并保存 socket.emit('message', response); },
});
// 对应着有一个socket监听, 监听服务器发来的消息 // 监听message事件,添加对话到messages中 socket.on('message', function(response) {
messages.add(response);
});
可以看得出来,上面的第二版算是比较合适了,但是还是有些别扭,数据要重复发送。因此终于到了需要定制的时刻了。
上面说了,有三种级别的定制。根据我的需求,只需要定制Model级别的就可以了,怎么定制呢?
和一开头的示例代码类似:
var Message = Backbone.Model.extend({
urlRoot: '/message',
sync: function(method, model, options){
if (method === 'create') {
socket.emit('message', model.attributes);
$('#comment').val('');
} else {
return Backbone.sync(method, model, options);
};
},
});
// 对应着上面的那个message.save后的一堆东西都可以去掉了,直接
message.save();
这样就好了,客户端只需要发送一次数据。但要记得在服务器端的监听message的接口上添加保存message的逻辑。
好了,定制就介绍这么多。关于上面提到的代码想了解上下文的,可以到我的wechat这个项目的master分支查看。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论