[关闭]
@mansonchor 2014-04-08T05:51:21.000000Z 字数 2019 阅读 1116

在单页应用 善用backbone MVC

在单页应用下,经常需要处理 大量 的DOM操作,事件绑定,AJAX,界面渲染等工作,即所谓 heavy js 项目,随着代码的增多,代码的耦合程度越高,可维护性会大大下降,影响开发效率

backbone提供了强大的对模型、视图和交互的抽象

数据模型(Model):负责数据模型,数据结构

数据集合(Collection):一组数据的实体集合,负责数据模型的 GET、POST、PUT、DELETE操作

视图(View):处理页面的渲染、事件绑定、交互等工作

先看一个业务例子:要从服务器获取一组作品,然后顺序列出来

一般的做法是

  1. $.ajax('data.php' , function(data)
  2. {
  3. $(data).each(fucntion(i,json)
  4. {
  5. //对数据进行循环渲染,中间可能会涉及模板使用
  6. var html_str = '<p>'+json.content+'</p><img src="'+json.img_url+'">'
  7. $('#container').append( html_str )
  8. })
  9. })

实现起来很简单,也很好理解

现在多加一个功能:按刷新按钮获取最新的数据

这时需要增加对刷新按钮的事件绑定了

  1. $('refresh_btn').tap(function()
  2. {
  3. $.ajax('data.php' , function(data)
  4. {
  5. $('#container').html('') //先把旧数据清掉
  6. $(data).each(fucntion(i,json)
  7. {
  8. //对数据进行循环渲染,中间可能会涉及模板使用
  9. var html_str = '<p>'+json.content+'</p><img src="'+json.img_url+'">'
  10. $('#container').append( html_str )
  11. })
  12. })
  13. })

如果之后再增加 加载更多和删除某篇作品的功能,你可以想象得到 事件、AJAX、对DOM的处理将杂乱无章的分布在你的代码里面。而这仅仅是你应用里的一个小功能

使用backbone,可以把作品结构映射到Models,通过作品集Collection可以获取数据,销毁或者保存到服务器上。当界面上的操作引起 Collection集合变化时,Collection会触发change事件;那些用来显示Collection状态的view会接受到Collection触发change的消息,进 而发出对应的响应,并且重新渲染新的数据到界面。在一个完整的backbone应用中,你不需要写那些胶水代码来从DOM中通过特殊的id来获取节点,或 者手工的更新HTML页面,因为在Collection发生变化时,views会很简单的进行自我更新。

  1. var art_model = Backbone.Model.extend({
  2. defaults:
  3. {
  4. content : "", //作品内容
  5. img_url : "" //作品图片
  6. }
  7. })
  8. var art_collection = Backbone.Collection.extend({
  9. model : art_model ,
  10. url : 'data.php'
  11. })
  12. var art_view = Backbone.View.extend({
  13. el : $('#container'),
  14. render : function()
  15. {
  16. //数据刷新界面DOM处理集中到这里
  17. var that = this
  18. that.$el.html('')
  19. art_collection_obj.each(function(art_model)
  20. {
  21. var html_str = '<p>'+art_model.attributes.content+'</p><img src="'+art_model.attributes.img_url+'">'
  22. that.$el.append( html_str )
  23. }
  24. },
  25. events : {
  26. //刷新按钮事件
  27. 'tap refresh_btn' : function()
  28. {
  29. art_collection_obj.fetch()
  30. }
  31. }
  32. })
  33. var art_view_obj = new art_view
  34. var art_collection_obj = new art_collection
  35. //collection reset事件和view的刷新处理联系上
  36. art_collection_obj.bind( 'reset' , art_view_obj.render )
  37. art_collection_obj.fetch() //初次数据获取

Restful

REST的好处是简化了客户端和服务器的实现。后端只负责业务系统实现和对外提供资源URI;前端负责构建数据模型和控制数据交互,因为界面和交互前端比后端更熟悉

利用backbone把数据结构迁移到前端,可以完整模拟Model和Collection的数据变化,完成业务流程的功能开发。而且不需要依赖和等待后端接口

后端接收到前端的数据需求之后,提供对应返回格式的资源URI并完全接管里面的处理逻辑

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注