初探Backbone.js

一、什么是Backbone.js

“Backbone.js通过模型,集合和视图构建web应用。模型是键-值绑定和自定义事件的,集合有丰富的API函数,视图用来声明事件操作,同时通过RESTful JSON 接口与已存在的API通信。”这句话出自Backbone官网介绍,很简单,也直接说明了Backbone的特点,如下:

  1. 它是一个前端框架,设计原则遵循MVC模式
  2. 它的Controller部分被collections所替代,controler被替代,只保留了Router的功能
  3. 支持RESTful形式的API调用

简而言之,像在Backbone.js官网里“Getting Started”中提到的,backbone.js 的存在,作用之一是为了在大量调用javascript时不再把数据与DOM绑定在一起,不再使用混乱的选择器和回调。保持数据在HTML样式,javascript逻辑和服务端数据库之间同步。不难发现,当一个web应用存在大量变化的数据和丰富的交互时,使用backbone.js是个不错的选择。

二、Backbone特点和使用体会

Backbone的特点:

  • 轻量(8kb)
  • 第三方模板(通常是underscore.js)
  • View层直接操作DOM,这样使得View上含有大量业务代码, 从而controler层面上只剩下Router
  • 不支持双向绑定

Backbone的View可以在HTML页面中局部使用,这样做的好处是可以获得模板兼容,甚至是同后端View层和谐相处。在我具体的业务代码中,后端使用了PHP的CI框架支持View,同时,在页面被CI执行了View.render()之后。Backbone接着通过Ajax返回的数据进行局部页面的下一步渲染,并不需要像Angular那样对写整个HTML文档改写,这样的使用方式可以窥见Backbone轻量快捷的特点。
在JS代码中使用字符串拼接HTML结构是一种简单粗暴的办法,然而诸如下面这样的代码十分不便于维护和阅读。
str += '<a href="http://xf.fangdd.com/' + g_city_pinyin + '/' + house_id + '.html"><li><var>' + name + '</var>' + strNewHouse + '<span class="pull-right">' + address + '</span></li></a>';

在Backbone所唯一依赖的库understore中,提供了一种很简单的方式来构造HTML结构:

<script type="text/template" id="same-cost-template">
  <% _.each(data, function(item, index) {%>
  <div class="others-house<% if(index == 2) { %> last <%}%>">
    <% if(item["house_img"]){ %>
    <img class="house-img" src="<%= item["house_img"] %>" />
    <% } else {%>
    <img class="house-img" src="{= asset_url('web/img/dt_house_image_sample.png')}" />
    <% } %>
    <div>
      <span><%= parseInt(item["house_price"]) %></span>¥
      <a target="_blank" href="<%= item["url"] %>">
        Test
      </a>
    </div>
  </div>
  <% }) %>
</script>

上面是一个Backbone中View层使用的模板,通过在实例化View层是,既实现了需要输出的HTML片段,也同时将业务逻辑包含在其中。这样做却使得View很重,后来发现,也正是因为这一点,Backbone不适合用来渲染局部HTML,因为View太重反而使得实例化一个View层时需要做一些工作,有点牛刀杀鸡,暂时还没有找到更好的替代品。Angular需要从HTML根节点开始对页面进行解析,所以也不适合,同时Angular比Backbone来说体积更大。到这里也提出一个问题:如何优化Backbone的View层,尤其是当View层只是负责展示内容,没有任何交互时,调用View.render()时,尽可能减少与Model层联系。更好简单的方式,或许可以直接从responseText中直接渲染,毕竟当Model()不需要数据变化时,直接把获取的数据交给View渲染或许可以更加省力,尽管这么做不符合Backbone的MVC模式。但利用Backbone轻量的优势,再提供一个更轻量的模板渲染功能可能会更有魅力。可以尝试Backbone所依赖的Underscore,或许作为第三方插件,它自己也可以将自定义的Model渲染出正确的View来,这个方法值得一试,如果可行,在当前的业务代码中,又可以把Backbone“干掉”,只使用Underscore来进行局部渲染!

三、小结

有痛点的地方就会有抱怨,就会有需求。这也是为什么现在Angular,React等框架如今大行其道。鉴于本人项目经验有限,暂未接触过上述框架,但不免好奇心驱使,附上一下链接与同仁共享:

  1. gitbug链接
  2. Angular.js Backbone.js Ember.js
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值