初探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"]){ %>
    ![](<%= item[)" />
    <% } else {%>
    ![]({= 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容