Backbone.js实践-踩坑和解决方法
- Time: 15 May 2014
- Categories:
- other 11
前面几天持续学习了bakcbone.js的基本概念和搭建一个简单App的大致流程,这不,马上就来动手实践了。搭建一个简单的应用雏形是非常容易的,但稍微增加了一些功能,就会频繁卡壳,特别是和后端数据交互的时候,知易行难,代码这东西,总是要在不断的实践中才能有更好的体会。我就把搭建应用的过程遇到的一些问题记录下。
###初始化项目
有自动化构建工具可以帮你搞定项目初始化的事情,当然手动搭建也不麻烦,新建应用目录结构,引入依赖文件等。整个应用的目录结构:
|_code.py
|_init_sqlite.py
|_mod_sqlite.py
|_showdata.py
|_static
| |_app
| | |_css
| | |_js
| | | |_app.js
| | | |_collections
| | | | |_items.js
| | | |_models
| | | | |_item.js
| | | |_views
| | | | |_item.js
| | | | |_itemForm.js
| | | | |_items.js
| |_vendor
| | |_backbone
| | |_bootstrap
| | |_jquery
| | |_underscore
|_templates
| |_index.html
###大致流程
- 规划好应用的url,并为每个url指定对应的action。
- 为app设置一个对象名称,比如图书管理应用,我们可以命名为BookManage,然后将所有的MVC对象都放入其中,便于管理
- 初始化模型数据(设定好必要属性字段)
- 初始化Collection和必要的处理方法
- 为各个界面初始化View,并创建对应的render事件。在View层有两件事情要做:一是处理UI界面的事件代理;二是监听数据变化来自动更新UI
###本地存储和服务端存储的操作差别
首先,在本地存储要引入backbone的localStorage组件,并在Collection中设置好localStorage属性,在服务端存储,要为Collection设置对应的服务端的url,并保证服务端支持RESTful的数据交互方式。
下面分别说明了两种方式的操作差别:
####本地存储
create Collection.add()
read new Views(Collection)
update Model.set(newAttr)
delete model.collection.remove(this.model)
####服务端存储
建议在每部操作加上wait:true参数保证数据真正的同步到服务端,服务端返回的也必须是严格的Model格式的json数据,否则会进入error回调分支。(一开始由于对web.py不太熟悉,所以在这里卡了很久,命名返回的是200,却总是进入error分支)
create Collection.create()
read Collection.fetch()
update Model.save()
delete Model.destory()
在View层,对数据监听的事件也会有所调整,比如fetch后,Collection会触发add事件,这时候,我们要监听add事件来更新UI。
###URLS
简单情况下,我们不要为Model设置url或者urlRoot,官方有申明,Model会自动根据其所属的Collection的url来构造。当然,如果要指定特殊的url,也可以在请求数据交互的时候额外指定url或者urlRoot. 源码:
function() {
var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();
if (this.isNew()) return base;
return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id);
}
有三种方式构造model的url:
- 如果model属于collection中,那么他的url可以用collection的url和model.id来构造(collection.ur/[id])
- 如果你想单独使用model,那么直接设置model.urlRoot
- 最后,如果你想单独给model指定url,那就设置model.url
###其他
- 因为对webpy不熟悉,比如db的返回值类型, json.dumps, json.load的格式问题
- 不清楚backbone的request应该对应哪种response,所在在调试的时候,http 返回的是200,但总是进入error分支
- 在更新UI的时候总会遇到莫名其妙的错误,比如某个变量无法取值,backbone和服务端通讯是异步的,所以要记得监听collection的事件绑定才能正确的更新UI