BackBone

backbone

Backbone.js提供模型(models)、集合(collections)、視圖(views)的結構。css

  • Models: 是引用程序的核心,也是表示數據,用於綁定鍵值數據和自定義事件html

  • Collectoins:是對Model的一個容器,包含多個模型,並提供一些方法,來訪問這些模型,集合附有可枚舉函數的豐富APIjquery

  • View:能夠在視圖中聲明時間,在視圖中處理集合或者模型,也能夠地工藝方法啊,能夠暴露出來一些藉口,視圖能夠聲明事件處理函數,並經過接口鏈接到應用程序。json

  • Router: 路由, 看做簡化版的控制器。(Backbone弱化了Controller)數組

使用
依賴的工具庫
jquery.js,zepto.js 等
underscore.js/lodash.js 等app

clipboard.png

Model

建立模型

//構造函數:
var pink = new Backbone.Model({
    color: 'pink'
});

//extend:
var Pink = Backbone.Model.extend({});

var p = new Pink({
    color: 'pink'
});

默認值

defaults: 表示模型類的默認值, 當模型實例化的時候,這些默認值就會被賦值上。dom

var WangCai = Backbone.Model.extend({
    
    //默認值
    defaults: {
        kg: 20,
        name: 'wangcai',
        age: 2
    }
        
});

initalize

initialize: 在模型對象的實例化時,構造函數能夠對模型再次更改ide

var WangCai = Backbone.Model.extend({

    //構造函數
    initialize: function () {
        
        if ( this.attributes.price ) {
            
            this.attributes.onSale = true;
            
        }
        
    }
    
});

獲取屬性

get,獲取模型實例化對象屬性的方法,直接在模型實例化對象上調用
參數:表示屬性值函數

var WangCai = Backbone.Model.extend({
    
    //默認值
    defaults: {
        kg: 20,
        name: 'wangcai',
        age: 2
    },
    
    //構造函數
    initialize: function () {
        
        if ( this.attributes.price ) {
            
            this.attributes.onSale = true;
            
        }
        
    }
    
});

var ww = new WangCai({
    price: 1000
});

var price = ww.get('price');

console.log( price ); //1000

Json 轉化

toJSON: 將模型對象的attributes屬性轉化爲JSON對象,該方法直接在模型對象上調用
等同於JSON.parse(JSON.stringify(clothes))方法工具

var clothes = new Clothes({
    price: 158
})

var attributes = clothes.toJSON();

設置屬性

set()
設置模型實例化對象屬性方法,直接在實例化模型對象上調用

第一種傳參方式

  • 參數1,屬性名稱

  • 參數2,屬性值

第二種傳參方式
傳遞一個對象,這個對象映射到模型的attributes上的屬性對象

var ww = new WangCai({
    price: 1000
});

ww.set('color','pink');    
ww.set({
    say: function () {},
    zf: 'dd'
});

Model事件

Backbone實例對象的繼承Backbone.Model,Backbone.Model繼承了事件的方法,因此就能夠在構造函數中使用綁定事件的方法on,經過this訪問

on方法的使用:

  • 第一個參數表示事件的名稱

  • 第二個參數表示事件的回調函數
    當調用set添加屬性時候會觸發change事件,但set傳遞{silent: true}參數時候,該事件就不能被觸發了

//構造函數
initialize: function () {
    
    //on事件可使用命名空間
    this.on('change',function ( model ) {
        
        console.log(123);
        
    });
    
}

ww.set({
    say: function () {},
    zf: 'dd'
},{silent: true });
//添加屬性不被事件捕獲, 經過 set的第二個參數 {silent: true} 來設置

模型對象是否被修改

hasChanged() 當模型調用了set更改屬性的時候,該方法返回true,表示被修改過。

//  ww 實例對象 未被修改
console.log( ww.hasChanged() );// false 
//            ww.set('color','pink',{silent: true });    
ww.set({
    say: function () {},
    zf: 'dd'
},{silent: true });
//實例對象  已經被修改,添加 其它屬性和方法 
console.log( ww.hasChanged() );// true

刪除屬性

unset() 刪除模型實例化對象上屬性, 直接在實例化對象上調用
參數1:刪除的屬性名
參數2:一些配置

ww.unset('zf');

validate:檢驗刪除是否合理,可是刪除方法unset時候,必須傳遞{validate: true}才能校驗
validate 驗證刪除是否合理,在unset第二個參數傳遞。

參數,是該實例化對象的attributes對象
返回:
true 刪除失敗
false 刪除成功

ww.validate = function (attr) {
    if (!attr.width) {
        return true;
        }
    return false;
}
// 驗證刪除操做
var result = a.unset('width', {validate: true})

View

backbone 視圖層

建立

//構造函數
var App = new Backbone.View({
    tanName: 'h1',
    id: 'app',
    className: 'app'
});

// extend
var App = Backbone.View.extend({
    
    initialize: function () {
        
        this.$el.html('¥79.00').css({
            'background': 'tan'
        })
        
    }
    
});

view實例化對象

cid: 該視圖實例化id
el: 該元素
$el: jquery的對象

視圖元素

el:表示視圖的元素

實例化建立添加屬性

var divView = new App({
    el: $('#app')
});

initialze

initialze 表示視圖類的構造函數

var App = Backbone.View.extend({
    
    initialize: function () {
        
        this.$el.html('¥79.00').css({
            'background': 'tan'
        })
        
    }
    
});

更改元素

setElement 將新元素替換原有的元素
divView.setElement();

  • 參數能夠是字符串,那麼就將該字符串渲染成元素

  • 參數也能夠是dom元素,那麼就直接該元素替換

在實例化後更改,因此不會影響到原構造函數已經執行的邏輯

divView.setElement('<h1>123</h1>');

獲取視圖內部的元素

$:視圖實例化對象爲咱們提供了一個方法來獲取其自身的元素

this.$el.html();

視圖模板

template, underscore提供獲取並格式化模板的方法

tpl: _.template('<div>¥<%= price%></div>');

//moduel
var Price = Backbone.Model.extend({
    defaults: {
        price: 100,
        info: 'xixihaha'
    }
})

//view
var View = Backbone.View.extend({
    
    model: new Price(),
    tpl: _.template('<div><span class="price">¥<%= price%></span><span class="mail"><%= info%></span></div>'),
    
    initialize: function () {
        
        //數據
        var data = this.model.toJSON();
        
        //html
        var html = this.tpl(data);
        
        this.$el.html(html).css('background','pink');
        
    }
    
})

var appView = new View({
   // model: new Price(),  //model 也能夠在 new View() 實例化的時候 進行
    el: $('#app')
});

渲染視圖

render:爲了讓視圖實例對象能夠在外部渲染視圖,定義的方法

// 視圖
var App = Backbone.View.extend({
    render: function () {
        // 渲染父頁面的視圖
        var item = new Item({
            model: new Price() //子視圖實例化
        })
        item.render();
        // console.log(item.el)
        this.$el.append(item.el)
    }
});            

var app = new App({
    el: $('#app')
});
app.render();

view 事件監聽

events: 基於委託模式,對el元素委託

{
    '事件名 委託元素的選擇器': '事件回調方法'
}

var ItemView = Backbone.View.extend({
    tpl: _.template($('#itemView').html()),
    events: {
        'mouseleave .item': 'hideSeeDom'
    },
    hideSeeDom: function (e) {
            this.$('.see').hide().css('top', 290)
    }
})

collection

集合:表示數據模型的一個有序集合

  • 每一個方法都有返回值

  • 每一個方法一般會有一個對應的事件,這個事件的名稱大部分是方法的名稱

建立collection

var ItemContainer = Backbone.Collection.extend({
    model: ItemModel //集合對應的模型
});

實例化collection

//能夠傳遞  js 對象,可是沒有id {} ,不建議
var item = new ItemModel();
var itemContainer = new ItemContainer(item); //一個 模型
var itemContainer = new ItemContainer([item1,item2]); //多個模型

collection添加模型

向集合中增長一個模型(或一個模型數組),會觸發"add"事件.
重複添加模型實例化對象會被去重的

var item = new ItemModel();
itemContainer.add(item);
itemContainer.add([item1]);

轉成JSON

能夠將一個集合轉化爲一個JSON對象
獲得的結果是一個新的對象,不是對原有對象的引用

itemContainer.toJSON()

獲取模型

get :接收模型參數,接收id,或者cid(若是對象有id,能夠經過對象獲取,若是對象沒有id就不能經過id獲取)
在建立模型的時,傳遞id屬性,此時,id屬性會被傳遞到模型的最外成屬性(attributes,cid,changed在一個層次)

clipboard.png

itemContainer.get(item);
itemContainer.get(id);
itemContainer.get(cid);

刪除模型

remove:刪除集合中的模型

  • 能夠傳遞一個模型

  • 也能夠傳遞一個模型組成的數組

  • 還能夠傳遞一個具備id的對象

  • 返回的結果是刪除的模型實例化對象

itemContainer.remove(item);
itemContainer.remove([item,time2]);

// remove 函數
//collection
var ItemCollection = Backbone.Collection.extend({
    model: ItemModel,
    initialize: function () {

        this.on('remove',function ( model ) {
            
            console.log( model );
            
        });
        
    }
})

collection initialize

collection構造函數,是在collection被實例化的時候調用,在它裏面添加的事件會監聽全部的實例化對象

var IterContainer = Backbone.Collection.extend({
    model: ItemModel,

    initialize: function () {

        this.on('add',function ( model ) {

            console.log(model); //false

        });

    }
});

collection events

collection 添加事件,事件有兩種添加方式

添加在構造函數內,此時會監聽全部實例化對象
添加在實例化對象上,只能監聽後面添加的行爲,只能監聽該實例化對象上添加行爲

//collection
var ItemCollection = Backbone.Collection.extend({
    model: ItemModel,
    initialize: function () {
        
        // add 添加  //在 initialize內添加
        this.on('add',function (model) {

            console.log( model );

        });
        
    }
})

//itemCollection.add([item,item2]); 觸發事件

//實例化對象上添加
itemContainer.on('add', function ( model ) {

    console.log( model );

});

重置collection

reset() 清空collection

reset事件與其餘方法的事件的區別,reset事件的回調函數中的參數是一個集合實例化對象,該對象就是構造函數中的this,
其餘方法的事件的回調函數的參數是一個模型實例化對象,不等於構造函數中的this
reset事件與其餘方法的事件區別,reset事件的回調函數中的參數是一個集合實例化對象,該對象就是構造函數中的this。
其它方法的時間的回調函數

colletion.reset();

//reset 事件

//collection
var ItemCollection = Backbone.Collection.extend({
    model: ItemModel,
    initialize: function () {
        
        //綁定事件
        this.on('reset',function ( model ) {
            
            console.log( model );
            
        });
        
    }
}

collection 映射數據

fetch
從服務端拉取數據映射到集合中

注意:在collection中 聲明屬性 url

var ItemModel = Backbone.Model.extend({});
            
var ListCollection = Backbone.Collection.extend({
    model: ItemModel,
    url: 'data/list.json',  //聲明
    initialize: function () {
        
        this.on('add',function ( model ) {
            
            console.log( model );
            
        });
        
    }
});

var listCollection = new ListCollection();

//拉取數據
listCollection.fetch({
    success: function ( collections ) {
        
        console.log( collections,'collections' );
        
    }
});

路由 router

//路由

var Routers = Backbone.Router.extend({
    
    routes: {
        home: 'showHome',
        'en/ch/:dict': 'showSerch'
    },
    
    showHome: function () {

        console.log('showHome');
        
    },
    
    showSerch: function ( dict ) {
        
        var dictView = new DictView({
            el: $('.div')
        });
        
        dictView.render( dict );
        
    }
    
});

var router = new Routers();

//開啓 路由 //須要在 history 開始
Backbone.history.start();

路由規則

經過 '/' 進行路由切分,自由匹配獲取,再前面加':' (注意:第一個'/'無關緊要)

#search/:query:page

*other 表示其它不匹配的規則都到該路由下,一般將該規則放到最後

var Routers = Backbone.Router.extend({

routes: {
    home: 'showHome',
    'en/ch/:dict': 'showSerch',
    '*other': 'showDefault'
},

showHome: function () {
    console.log('showHome');
},

showSerch: function ( dict ) {
    
    var dictView = new DictView({
        el: $('.div')
    });
    
    dictView.render( dict );
    
},

showDefault: function () {
    
    console.log('showDefault');
    
}

});

var router = new Routers();

//開啓 路由
Backbone.history.start();

Events

在backbone中用events表示事件對象,可是它是單體對象,不要直接使用它,將它的屬性和方法繼承下來。
爲了不衝突,須要使用空對象添加屬性和方法。

var myEvent = _.extend({}, Backbone.Events);

訂閱事件

on方法訂閱事件

var EventsModel =  Backbone.Model.extend();


var events = new EventsModel();

events.on('dd',function ( msg ) {
    
    console.log( msg );
    
});

發送事件

trigger()

events.trigger('dd','info');

註銷事件

off()
註銷事件,寫在觸發事件的前面
註銷帶有命名空間的事件,須要添加上命名空間

myEvent.off('change')
myEvent.off('change:color')

取消其它對象監聽

stopListening()
參數:

  • 能夠不傳,取消全部對全部對象的監聽

  • 一個參數:被監聽的對象,此時取消該對象上的全部的事件監聽

  • 兩個參數:此時取消該對象上該事件的監聽

    // 取消監聽
    ev1.stopListening();
    
    // 僅僅取消對ev2的監聽
    ev1.stopListening(ev2);
    
    // 僅僅取消ev2上面的change事件
    ev1.stopListening(ev2, 'change');

多個對象消息監聽

//多個事件 聯繫
 
var ev1 = _.extend({},Backbone.Events);
var ev2 = _.extend({},Backbone.Events);
var ev3 = _.extend({},Backbone.Events);

ev2.listenTo(ev1, 'change', function ( msg ) {
    
    console.log( msg );
    
});

ev2.listenTo(ev1, 'add', function ( msg ) {
    
    console.log(msg);
    
});

ev2.listenTo(ev1, 'dd', function ( msg ) {
    
    console.log(msg);
    
});

ev2.stopListening(ev1, 'change');

ev1.trigger('change', 'hello');
ev1.trigger('add', 'world');

ev1.trigger('dd', 'pink');

M、V、Collections消息監聽

//模型 和  視圖  之間的 事件聯繫  collection 和 view 之間的聯繫
var eventModel = new Backbone.Model();

var eventView = new Backbone.View();

var EventCollection = Backbone.Collection.extend();

var eventCollection = new EventCollection();

eventView.listenTo(eventModel,'change',function ( msg ) {
    
    console.log(msg);
    
});

eventView.listenTo(eventCollection, 'remove', function ( msg ) {
    
    console.log( msg,'--' );
    
});

eventModel.set({
    color: 'pink',
    age: 2
});

eventCollection.add(eventModel);
eventCollection.remove(eventModel);
相關文章
相關標籤/搜索