Backbone.js 是一個 Javascript Framework,它提供了簡單的view和model的使用,讓程式碼看起來比較不會髒亂,開發者也比較好維護。另外Backbone.js不是MVC的Framework,因為並沒有controller。
Backbone.js跟jQuery搭配操作DOM Tree,在使用上也還算方便
Backbone.js主要有以下四種類別:
- Model
- View
- Router
- Collection
使用Backbone.js
<!-- 使用Backbone.js必須也加入它所依賴的函式庫Underscore.js --> <script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.3/underscore-min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.9/backbone-min.js"></script>
Model:存放資料的類別,同時也可以綁定一些資料異動時的事件
基本Model操作:
//建立Model Person var Person = Backbone.Model.extend({ //initialize 為Model的Constructor initialize: function() { console.log('Build'); }, //預設值 defaults : { 'name':'John', 'age':'13' } }); //建立Model var man = new Person({'name':'Johnson','age':'25'}); //設定參數 man.set('name','Tom'); //取得參數 console.log(man.get('name')); //將Model轉成JSON console.log( man.toJSON() );
Model event控制
var Person = Backbone.Model.extend({ //initialize 為Model的Constructor initialize: function() { console.log('Build'); //監聽事件,當name被修改時觸發(change:name之間不可有空白) this.on('change:name',function(){ alert('name already change'); }); }, defaults : { 'name':'Johnson', 'age':'25' } });
View:用來代表HTML中所指定的區塊,並針對初始化其事件做設定
View的操作
HTML:
<div id="doc"> <button class="action">Button</button> <ul> <li class="test"><a href=""></a></li> </ul> </div>
View(將上段HTML建成View)
//建立View var theView = Backbone.View.extend({ //View的root element el : $('#doc'), //Constructor initialize: function() { alert("View is Build"); //直接呼叫open function this.open(); }, //事件(對應到render function) events: { 'click .action' : 'open', }, //render function open: function(e){ //取出匯入Model的值 alert( this.model.get('name') ); //this.$el 代表 view指定的el元素(jQuery Object) alert( this.$el.attr('id') ); //$(e.target) 代表 觸發click event的 .action 元素(jQuery Object) alert( $(e.target).html() ); }, });
Model
//建立Model(這裡沒有使用Model.extend繼承Model,而是直接手動建立一個新Model物件) var myModel = new Backbone.Model({ 'name':'Johnson', 'age':'30' });
產生View Object並傳入Model
var view = new theView({ 'model': myModel });
View 載入 template
HTML
<div id="doc"> <script type="text/template" id="search_template"> <label>Search</label> <input type="text" id="search_input" /> <input type="button" id="search_button" value="Search" /> </script> </div>
View
var SearchView = Backbone.View.extend({ el: $("#doc"), initialize: function(){ this.render(); }, render: function(){ // Compile template var template = _.template( $("#search_template").html(), {} ); // 將template寫入el中 this.$el.html( template ); } }); var search_view = new SearchView();
View 載入 template(加入動態參數)
HTML
<!-- <%= %> 輸出變數;<%- %> html escape 變數;<% %>程式區塊 --> <script type="text/template" id="search_template"> <% alert(123); %> <label><%= search_label %></label> <input type="text" id="search_input" /> <input type="button" id="search_button" value="<%- search_value %>" /> </script>
View
var SearchView = Backbone.View.extend({ el: $("#doc"), initialize: function(){ this.render(); }, render: function(){ // 參數 var params = {search_label:"TEST",search_value:"搜尋"}; // Compile template var template = _.template( $("#search_template").html(), params); // 將template寫入el中 this.$el.html( template ); } }); var search_view = new SearchView();
Router:能針對不同的 fragment 給予相對應的callback function
Router基本操作
HTML:
<a href="#goFacebook">Facebook</a> <a href="#go/google">Google</a> <a href="#TEST/TEST/TEST">Yahoo</a>
Javascript
var router = Backbone.Router.extend({ routes: { //按照參數數量分別轉送到不同的Function ':par1':'fun1', ':par1/:par2':'fun2', //後面為任何字串,若以上不符合,進入到此Function '*action':'fun3' }, fun1 : function( par1 ){ alert("fun1: " + par1); }, fun2 : function( par1, par2){ alert("fun2: " + par1 + " " + par2 ); }, fun3 : function( other ){ //沒有任何fragment時也會進到這個function if( other != '') alert("fun3: " + other); } }); //建立router物件 new router(); //啟動Router Backbone.history.start();
Collection:可以當成Model的陣列
Collenction用法
//建立Model var Dog = Backbone.Model.extend({ initialize: function(){ console.log('New Dog to be born'); }, defaults:{ 'name':'Lucky', 'age':1 } }); //建立Collection var Animals = Backbone.Collection.extend({ initialize: function() { console.log("Animals Collection is initialized"); }, //指定存放的類型 model: Dog, //定義排序 comparator:function(animals1, animals2){ //用年紀排序(數字大的在前面) return animals1.get('age') < animals2.get('age'); }, //可以從該url fetch json資料存進Collection url:'a.php' }); var animals = new Animals(); var dog = new Dog(); //新增 animals.add(dog); animals.add([{'name':'jiajia','age':12},{'name':'black','age':3}]); //Fetch JSON(需定義URL),會自動存進Collection(會執行reset) animals.fetch(); //排序(需定義comparator) animals.sort(); //取出所有Collection裡的特定欄位 console.log( animals.pluck('name') ); //取出姓名叫Lucky的Model console.log( animals.where({'name':'Lucky'}) ); //Stack animals.push(dog); console.log( animals.pop() ); //清空Collection後再存入dog animals.reset(dog); //刪除特定物件 animals.remove(dog); //觸發event animals.on('add', function(){ alert('RESET'); }); //alert RESET animals.add(dog); //將Collection以JSON格式轉出 console.log( animals.toJSON() ); //按照Collection順序可依index讀取Model console.log( animals.at(0) );
fetch部份也可以透過success和error參數做一些操作
collection.fetch({ success:function(collection,response){ //dosomething }, error:function(collection,response){ //dosomething } });
其他用法
傳入參數物件
var COLLECTION = Backbone.Collection.extend({ initialize: function( obj ){ alert(obj.name); } }); new COLLECTION({name:'Johnson'});
JSONP用法(重新定義fetch)
var COLLECTION = Backbone.Collection.extend({ url: "http://example.com", fetch:function(){ var self = this; var result = $.ajax({ url:self.url, type: "get", dataType: "jsonp", jsonpCallback : "jsonp_callback", }); result.done(function(res){ self.reset(res); console.log(self.toJSON()); }); } }); var collection = new COLLECTION(); collection.fetch();