Backbone簡介

1. 前言

  本文的目的,是幫助大家快速理解掌握Backbone的使用,但它并不是API,因此我不會將每一個方法都詳細地描述,但是我會告訴你如何學習它們。

  這是一篇稍稍較長的技術文章,因為我想將我所了解的東西盡可能詳細地分享給大家。但它還不至于出版為一本書籍,因為Backbone其實非常簡單。當然,這并不表示Backbone提供的功能有限,相反,它能用簡單的實現構建出復雜的應用,這正是Backbone的強大之處。

  在正式學習Backbone之前,你需要準備一些東西:

  首先,你需要獲取Backbone框架源文件:http://documentcloud.github.com/backbone/

  Backbone依賴于Underscore框架的基礎方法,因此,你同時需要下載Underscore框架的源文件:http://documentcloud.github.com/underscore/

  在Backbone中,對DOM和事件的操作依賴于第三方庫(如jQuery或Zepto),你只需要選擇其中一個下載:

  jQuery:http://jquery.com/

  Zepto:http://zeptojs.com/

  看起來好像挺麻煩的樣子,但Backbone的目的是在于使用簡單的框架來構建復雜的應用,因此麻煩并不表示它很復雜。

  在后續章節,我將詳細介紹它們之間的關系和依賴,但在此之前,你可以新建一個HTML頁面,并將這些框架引入進來,就像這樣:?

[html]?view plain?copy

  1. <script?type="text/javascript"?src="jquery/jquery-1.8.2.min.js"></script>??
  2. <script?type="text/javascript"?src="underscore/underscore-min.js"></script>??
  3. <script?type="text/javascript"?src="backbone/backbone-min.js"></script>??

 至此,你已經準備好了運行Backbone必須的環境。

如果學習過程中有任何問題,或者你有更好的建議,歡迎聯系我一起交流:

2. 什么是Backbone?

  Backbone是一個輕量級的前端MVC框架,用于結構化管理頁面中的大量JS,建立與服務器、視圖間的無縫連接,為構建復雜的應用提供基礎框架。

下面我先簡單地闡述下Backbone的主要特點及特性:

2.1 輕量級

  Backbone的源碼只有1000行左右(去注釋和空行后),文件大小只有16KB,加上依賴庫Underscore,也僅有29KB。

  你只需要花一點時間,就能輕松了解Backbone內部實現;或編寫少量代碼,來重載Backbone的部分機制;如果你想在Backbone的基礎上做二次開發,也并不是一件復雜的事情。

2.2 MVC結構化

  Backbone可以輕松將頁面中的數據、邏輯、視圖解耦,依照Backbone進行代碼結構組織,你可以將項目中的數據交互、業務邏輯、用戶界面等工作,分配給多個同事同時開發,并能有序地組織到一起。同時,這對于大型和復雜項目的維護開發非常有幫助。

2.3 繼承機制

  在Backbone中,模塊是可以被繼承的,你可以通過面向對象的方式將應用中的數據模型、集合、視圖有序地組織,讓整個架構更加清晰;也可以方便地重載和擴展自定義方法。

2.4 建立與服務器的無縫連接

  在Backbone中內置了一套與服務器數據的交互規則(如果你了解REST架構,就能夠輕松地理解它們),而數據的同步工作會在Model中自動進行,前端開發人員只需對客戶端數據的進行操作,Backbone會自動將操作的數據同步到服務器。

  這是件非常有趣的事情,因為服務器數據接口對前端開發者來說是透明的,他們不需要再關心如何和服務器交互。

  然而服務器提供的數據接口也需要兼容Backbone的規則,對于一個新的項目來說,我們可以嘗試使用這套規則來構建接口。但如果你的項目中已經有一套穩定的接口,你可能會擔心接口改造的風險。

  沒關系,我們可以通過重載Backbone.sync方法來適配現有的數據接口,針對不同的客戶端環境,我們還可以實現不同的數據交互方式。例如:用戶通過PC瀏覽器使用服務時,數據會實時同步到服務器;而用戶通過移動終端使用服務時,考慮到網絡環境問題,我們可以先將數據同步到本地數據庫,在合適的時候再同步到服務器。而這些只需要你重載一個方法就可以實現。

2.5 界面事件管理

  在MVC中,我們希望能將界面展現和業務邏輯完全分離,但對于用戶產生的交互事件(如單擊事件),我們卻常常通過類似jQuery中的bind方法進行獲取和綁定。

  Backbone中的視圖幫助我們將用戶事件和執行方法有序的組織起來,這只需要我們聲明一個簡單的表達式,例如:

[javascript]?view plain?copy

  1. events:?{??
  2. ????//?單擊id為”save”的元素時,執行視圖的add方法??
  3. ????'click?#save':?'add',??
  4. ????'mousedown?.button':?'show',??
  5. ????'mouseover?.button':?'hide'??
  6. }??

在表達式中,事件名稱可以是任意的DOM事件(如click、mouseover、keypress等),元素可以是jQuery支持的任意選擇器(如標簽選擇器、id選擇器、class選擇器等)。

  視圖會自動將表達式中的事件綁定到選擇器元素,當元素的事件被觸發后,視圖會自動調用表達式中綁定的方法。

2.6 輕量級模板解析

  模板解析是Underscore中提供的一個方法。為什么我要在介紹Backbone特性時引入Underscore中的方法?因為該方法能幫助我們更好地分離視圖結構和邏輯,且Underscore是Backbone必須依賴的庫。

  模板解析方法能允許我們在HTML結構中混合嵌入JS代碼,就像在JSP頁面中嵌入JAVA代碼一樣:

[html]?view plain?copy

  1. <ul>??
  2. ????<%?for(var?i?=?0;?i?<?len;?i++)?{?%>??
  3. ????<li><%=data[i].title%></li>??
  4. ????<%?}?%>??
  5. </li>??

通過模板解析,我們不需要在動態生成HTML結構時拼接字符串,更重要的是,我們可以將視圖中的HTML結構獨立管理(例如:不同的狀態可能會顯示不同的HTML結構,我們可以定義多個單獨的模板文件,按需加載和渲染即可)。

2.7 自定義事件管理

  在Backbone中,你可以使用on或off方法綁定和移除自定義事件。在任何地方,你都可以使用trigger方法觸發這些綁定的事件,所有綁定過該事件的方法都會被執行,如:

[javascript]?view plain?copy

  1. var?model?=?new?Backbone.Model();??
  2. //?在model對象中向自定義事件custom綁定兩個函數??
  3. model.on('custom',?function(p1,?p2)?{??
  4. ????//?todo??
  5. });??
  6. model.on('custom',?function(p1,?p2)?{??
  7. ????//?todo??
  8. });??
  9. //?觸發custom事件,將調用上面綁定的兩個函數??
  10. model.trigger('custom',?'value1',?'value2');??
  11. //?移除custom事件中綁定的所有方法??
  12. model.off('custom');??
  13. //?觸發custom事件,但不會執行任何函數,已經事件中的函數已經在上一步被移除??
  14. model.trigger('custom');??

如果你熟悉jQuery,你會發現它們與jQuery中的bind、unbind和trigger方法非常類似。

  另外,Backbone支持一個特殊事件”all”,當在一個對象中綁定了名為”all”的事件后,該對象在觸發任何事件時,都會同時觸發”all”事件中綁定的方法。有時這種方法會非常有用,例如我們可以通過”all”事件監聽對象狀態的變化。

2.8 路由器

  在單頁應用中,我們通過JavaScript來控制界面的切換和展現,并通過AJAX從服務器獲取數據。

  可能產生的問題是,當用戶希望返回到上一步操作時,他可能會習慣性地使用瀏覽器“返回”和“前進”按鈕,而結果卻是整個頁面都被切換了,因為用戶并不知道他正處于同一個頁面中。

  對于這個問題,我們常常通過Hash(錨點)的方式來記錄用戶的當前位置,并通過onhashchange事件來監聽用戶的“前進”和“返回”動作,但我們發現一些低版本的瀏覽器(例如IE6)并不支持onhashchange事件。

  Backbone提供了路由控制功能,通過Backbone提供的路由器,我們能通過一個簡單的表達式將路由地址和事件函數綁定在一起,例如:

[javascript]?view plain?copy

  1. var?CustomRouter?=?Backbone.Router.extend({??
  2. ????routes:?{??
  3. ????????'':?'index',?//?當URL?Hash在根目錄時執行index方法:url#??
  4. ????????'list':?'getList',?//?當URL?Hash在list節點時執行getList方法:url#list??
  5. ????????'detail/:id':?'query',?//?當URL?Hash在detail節點時執行query方法,并將detail后的數據作為參數傳遞給query方法:url#list/1001??
  6. ????????'*error':?'showError'?//?當URL?Hash不匹配以上規則時,?執行error方法??
  7. ????},??
  8. ????index:?function()?{??
  9. ????????alert('index');??
  10. ????},??
  11. ????getList:?function()?{??
  12. ????????alert('getList');??
  13. ????},??
  14. ????query:?function(id)?{??
  15. ????????alert('query?id:?'?+?id);??
  16. ????},??
  17. ????showError:?function(error)?{??
  18. ????????alert('error?hash:?'?+?error);??
  19. ????},??
  20. });??
  21. ??
  22. var?custom?=?new?CustomRouter();??
  23. Backbone.history.start();??

請嘗試將這段代碼復制到你的頁面中,并依次訪問以下地址(其中URL表示你的頁面地址):

  • URL
  • URL#list
  • URL#detail/1001
  • URL#hash1
  • URL#hash2

  請再試著使用瀏覽器的“返回”和“前進”按鈕來回切換剛剛輸入的地址。

  你可以看到,當URL Hash發生變化時,會執行所綁定的方法,當遇到沒有定義的Hash時,都會執行showError方法,并將未定義的Hash傳遞給該方法。

  Backbone默認會通過Hash的方式來記錄地址的變化,對于不支持onhashchange的低版本瀏覽器,會通過setInterval心跳監聽Hash的變化,因此你不必擔心瀏覽器的兼容性問題。

  對于支持HTML5 pushState特性的瀏覽器,Backbone還允許你通過pushState來創建個性化的URL,但是這需要你的Web服務器做一些適配。

?

3. Backbone的適用性

  Backbone并不像jQuery那樣具有非常強的適用性,如果你正準備構建一個大型或復雜的單頁Web應用,那么Backbone再適合不過。

  如果想將Backbone應用到你的網站頁面中,且頁面中并沒有復雜的邏輯和結構,那么這只會讓你的頁面更加繁瑣和難以維護。

  如果你的項目并不復雜,但你卻深深喜歡它的某個特性(可能是數據模型、視圖管理或路由器),那么你可以將這部分源碼從Backbone中抽取出來,因為在Backbone中,各模塊間的依賴并不是很強,你能輕易的獲取并使用其中的某一個模塊。

?

4. 依賴庫

  你不能獨立使用Backbone,因為它的基礎函數、DOM操作、AJAX都依賴于第三方庫。

4.1 Underscore

  (必選)

  Underscore是一個用于提高開發效率的基礎函數庫,它封裝了對集合、數組、對象、函數的常用操作,就像jQuery封裝DOM對象一樣,你能通過Underscore輕易地訪問和操作JavaScript內部對象。

  Underscore還提供了一些非常實用的函數方法,如:函數節流、模板解析等。

  關于Underscore中一些主要的方法,我會在下一章詳細介紹,但在此之前你必須了解:Underscore是Backbone必須依賴的庫,因為在Backbone中許多實現都是基于Underscore。

4.2 jQuery和Zepto

  (可選)

  相信你對jQuery一定不會陌生,它是一個跨瀏覽器的DOM和AJAX框架。

  而對于Zepto你可以理解為“移動版的jQuery”,因為它更小、更快、更適合在移動終端設備的瀏覽器上運行,它與jQuery語法相同,因此你能像使用jQuery那樣使用它。

  Zepto目前僅支持Webkit內核的瀏覽器,因此它能兼容IOS、Adnroid、塞班、黑莓和Meego等大部分移動系統,而對于Windows Phone或Firefox OS,它暫時還不支持。

  因為jQuery和Zepto語法相同,因此對于Backbone來說,你無論是使用jQuery還是Zepto,都沒有問題(當然,你不可能兩個同時都用到)。

  在Backbone中,DOM選擇器、DOM事件和AJAX,都使用了jQuery的方法。這里之所以所它們是可選的,是假設你沒有用到Backbone中的視圖和AJAX數據同步功能,那么就不需要導入它們。

  如果你不想使用jQuery或Zepto,而是使用其它的、或自定義庫,只要你的庫中實現了與jQuery語法相同的DOM選擇器、事件管理和AJAX方法,那么就不會任何問題。

Backbone允許你通過setDomLibrary方法動態配置需要使用的第三方庫,這種情況常常用于:

  你的自定義庫雖然包含了和jQuery相同語法的方法,但全局變量并不是$,而且你想保持現有的命名。這時你可以通過setDomLibrary方法將其設置為Backbone內部引用的對象。

  你希望通過檢查用戶的環境,來決定更適合使用哪一個庫。例如:如果用戶使用PC瀏覽器訪問,則載入jQuery,如果用戶通過移動終端訪問,則載入Zepto。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456824.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456824.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Android Studio搭建Android集成開發環境

一、Android Studio簡單介紹 2013年GoogleI/O大會首次發布了Android Studio IDE&#xff08;Android平臺集成開發環境&#xff09;。它基于Intellij IDEA開發環境&#xff0c;旨在取代Eclipse和ADT&#xff08;Android開發者工具&#xff09;為開發者提供更好的開發工具。既然G…

[Oracle]UNIX與Windows 2000上Oracle的差異(I)

作者&#xff1a;Ian Adam & David Stien, SAIC Ltd 日期&#xff1a;19-Dec-2003 出處&#xff1a;http://www.dbanotes.net翻譯&#xff1a;Fenng -----------------------------------------------------------------------------------------------------------------…

django2.x報錯No module named 'django.core.urlresolvers'

解決方法就是: from django.urls import reverse 最近從django1.9遷移到django2.0中出現一個意外的報錯&#xff1a; 這個報錯的原因在stack overflow上有很直接的解釋&#xff0c;但是百度上并沒有直接的答案。 簡單來說&#xff0c;原因就是&#xff1a;django2.0 把原來…

Underscore簡介

5. Underscore.js Underscore封裝了常用的JavaScript對象操作方法&#xff0c;用于提高開發效率。它本身與我們介紹的主題“Backbone”沒有半毛錢的關系&#xff0c;因此你可以完全不理會“Backbone”的概念來學習它&#xff0c;或將它單獨運用到任何一個頁面。&#xff08;另外…

POJ2190 HDU2714 ISBN

USACO 2003 Fall Orange 問題鏈接&#xff1a;POJ2190 HDU2714 ISBN。 問題簡述&#xff1a;參見上述鏈接。 問題分析&#xff1a; 單純的計算問題。需要注意以下幾點&#xff1a; 1.如果是末尾數&#xff0c;則輸出為‘X’&#xff1b; 2.如果能找到對應的值則輸出&#xff1b…

Django-安裝xadmin的方法及主要配置方法

歷經千辛萬苦&#xff0c;終于實現了django2.1中xadmin的使用 被論壇里各路神仙帶跑N次 準確說是幾個小時 直接colne https://github.com/Liu0330/xadmin 工作系統環境&#xff1a;win10Python3.6.xDjango2.1.xXadmin2.0&#xff08;注意2.2版本就不行&#xff01;&#xff…

大數據集群搭建之Linux的安裝(一)

1、準備工具 VMWare、centos mimal版本系統文件。 2、工具安裝 1、安裝vmware軟件 安裝軟件地址&#xff1a; VMWare&#xff1a;http://pan.baidu.com/s/1qYnySrE 密碼&#xff1a;3t3r centos mimal版本&#xff1a;http://pan.baidu.com/s/1dE5LY6H 密碼&#xff1a…

阻止事件冒泡兩種方式:event.stopPropagation();和return false;

jQuery提供了兩種方式來阻止事件冒泡。 方式一&#xff1a;event.stopPropagation(); $("#div1").mousedown(function (event) {event.stopPropagation(); }); 方式一&#xff1a;return false; $("#div1").mousedown(function (event) {return false; });…

關于電腦的基礎單詞筆記

chapter01 mouse 鼠標. keyboard 鍵盤. notepad 記事本 . sava 保存. chapter02 word 文本文檔. office 辦公軟件. copy 復制. past 粘貼. find 復制. table 表格. page 頁. picture 圖片. chapter03 sheet 工作薄. cell 單元格. number 數字. true 真. …

Python3.6+Django2.0+Xadmin2.0學生信息管理系統

一、創建模型 模型是表示我們的數據庫表或集合類&#xff0c;并且其中所述類的每個屬性是表或集合的字段&#xff0c;在 app/models.py 中定義。 1、首先&#xff0c;導入models模塊 from django.db import models 接下來創建個學生信息類&#xff0c;其中包含學生姓名、性別…

升級 pip版本

安裝第三方庫&#xff1a;pip install Pillow 出現 You are using pip version 7.1.2, however version 9.0.1 is available. You should consider upgrading via the python -m pip install --upgrade pip comm and. 解決方法1&#xff1a; 輸入“python -m pip install -U pi…

大數據集群搭建之節點的網絡配置過程(二)

緊接著上一章來設置windows的vmnet8的ip地址和虛擬機中centos的ip地址。 NAT虛擬網絡的配置圖如下圖所示&#xff1a; 1、這里根據VMware中得到的網關地址去設置vmnet8的ip地址。 網關地址查看&#xff1a; 2、得到的網關地址后去設置vmnet8&#xff0c;將網關地址設置為v…

Python3.6+Django2.0+Xadmin2.0學生信息管理系統-2

1、上傳圖片/文件等資源 有時候需要添加一些附件&#xff0c;例如&#xff0c;新生剛入學&#xff0c;大家相互之間還不熟悉&#xff0c;希望能通過照片來加深印象&#xff0c;并且方便教學管理。 首先&#xff0c;對demo/urls.py文件進行改造&#xff0c;給urlpatterns添加s…

vim自帶的練習教程(vimtutor)

聲明&#xff1a;本文源于Centos 7.2系統vim自帶的練習教程--vimtutor歡迎閱 讀《 V I M 教 程 》 - 版本 1.7 Vim 是一個具有很多命令的功能非常強大的編輯器。限于篇幅&#xff0c;在本教程當中就不詳細介紹了。本教程的設計目標是講述一些必要的基本命令&#xff0c;而掌握…

pycharm之no python interpreter configured for project的解決辦法

今天由于重裝了系統&#xff0c;所以必須得重新配置一些軟件&#xff0c;在打開pycharm運行程序時顯示“no python interpreter configured for project”提示。根據字面意思是“python沒有解釋器”。 解決辦法&#xff1a; 找到你之前下載python環境支持庫如下圖所示&#x…

Python是非常優美的語言,那到底如何個美呢?

我把Python里面非常有名的簡潔&#xff0c;高效&#xff0c;方便的代碼整理出來&#xff0c;讓我們來一睹她的風采。其實每個主題展開講都是很大的篇幅&#xff0c;今天我們先overview一下 看完之后&#xff0c;相信初學者會更快的喜歡上python. 1.列表推導 要說Python里面最…

js生成驗證碼并且驗證

<html> <head> <title>驗證碼</title> <style type"text/css"> #code { font-family:Arial; font-style:italic; font-weight:bold; border:0; letter-spacing:2px; color:blue; } </style> <script type &qu…

大數據集群搭建之hadoop、tomcat、jdk等工具的安裝(三)

目錄一、準備的資源&#xff1a;二、安裝配置過程 目錄 本章就說下各種軟件的安裝和配置。 一、準備的資源&#xff1a; 1、tomcat(如用于在網頁上查看HDFS的存儲等) 地址&#xff1a;http://pan.baidu.com/s/1miC93ny 密碼&#xff1a;52dd 2、jdk 地址&#xff1a;ht…

pycharm 快捷鍵大全

1、編輯&#xff08;Editing&#xff09; Ctrl Space 基本的代碼完成&#xff08;類、方法、屬性&#xff09; Ctrl Alt Space 快速導入任意類 Ctrl Shift Enter 語句完成 Ctrl P 參數信息&#xff08;在方法中調用參數&#xff09; Ctrl Q 快速查看文檔 F1 Web幫…

轉載 Spark性能優化指南——基礎篇

前言 在大數據計算領域&#xff0c;Spark已經成為了越來越流行、越來越受歡迎的計算平臺之一。Spark的功能涵蓋了大數據領域的離線批處理、SQL類處理、流式/實時計算、機器學習、圖計算等各種不同類型的計算操作&#xff0c;應用范圍與前景非常廣泛。在美團?大眾點評&#xff…