Backbone入門(mén)之集合(Backbone.Collection)

我的個(gè)人博客

上一篇,我們講述了Backbone模型的入門(mén)學(xué)習(xí)艘绍,本篇開(kāi)始學(xué)習(xí)Backbone集合魂贬。

Backbone集合是模型的有序組合,通過(guò)拓展Backbone.Collection對(duì)象來(lái)創(chuàng)建集合:


    var app = app || {};
    app.MenuModel = Backbone.Model.extend({
        defaults: {
            title: 'this is a menu',
            name: '最近聯(lián)系人',
            status: 'active'
        }密浑,
        idAttribute: 'idx'
    });
    app.MenuCollection = Backbone.Collection.extend({
        model: app.MenuModel
    });
    app.menu = new app.MenuModel({
        status: 'inactive',
        idx: '001'
    });
    app.menus = new app.MenuCollection([app.menu]);
    console.log(app.menus.length); //1

在創(chuàng)建集合時(shí),通過(guò)model屬性設(shè)置集合中的模型類型粗井,實(shí)例化集合時(shí)尔破,可以傳入對(duì)象或數(shù)組街图,它們將被自動(dòng)轉(zhuǎn)換為通過(guò)model設(shè)置的模型類型。

初始化

在創(chuàng)建集合時(shí)懒构,可以設(shè)置initialize函數(shù)餐济,在實(shí)例化集合時(shí),將自動(dòng)調(diào)用執(zhí)行initialize函數(shù):


    app.MenuCollection = Backbone.Collection.extend({
        model: app.MenuModel,
        initialize: function() {
            console.log('集合初始化成功');
        }
    });
    app.menus = new app.MenuCollection([app.menu]);

打印值如下:

初始化打印值

集合屬性方法

  • models

    此屬性返回集合中模型數(shù)組:

        app.MenuModel = Backbone.Model.extend({
               defaults: {
                   title: 'this is a menu',
                   status: 'inactive'
               }
            });
        app.MenuCollection = Backbone.Collection.extend({
              model: app.MenuModel,
              initialize: function() {
                  console.log('集合初始化成功');
              }
        });
        var menus = [
            {
                id: 1,
                name: '最近會(huì)話',
                status: 'active'
            },
            {
                id: 2,
                name: '通訊錄',
                status: 'inactive'
            }
        ]
        app.menus = new app.MenuCollection(menus);
        console.log(app.menus.models.length); //2
    
  • toJSON()

    Collection.toJSON()方法返回集合中所有模型attributes對(duì)象拷貝副本的JSON格式對(duì)象數(shù)組:

        
        console.log(app.menus.toJSON());
    
    Collection.toJSON()

集合與模型

Backbone.Collection對(duì)象允許我們通過(guò)多種方法對(duì)模型進(jìn)行管理胆剧。

添加/移除模型

集合創(chuàng)建以后絮姆,可以使用add()和remove()方法添加或移除集合中的模型:


    app.MenuModel = Backbone.Model.extend({
           defaults: {
               title: 'this is a menu',
               status: 'inactive'
           }
       });
    app.MenuCollection = Backbone.Collection.extend({
        model: app.MenuModel,
        initialize: function() {
            console.log('集合初始化成功');
        }
    });
    var menu1 = new app.MenuModel({
        name: '最近會(huì)話',
        status: 'active'
    });
    var menu2 = new app.MenuModel({
        name: '通訊錄',
        status: 'inactive'
    });
    var menu3 = new app..MenuModel({
        name: '公告',
        status: 'inactive'
    });
    app.menus = new app.MenuCollection([menu1, menu2]);
    console.log(app.menus);

app.menus打印值如下:

app.menus集合

    app.menus.add(menu3);
    console.log(app.menus.length);//3
    app.menus.remove(menu2);
    console.log(app.menus.length);//2

檢索模型

  • get()

    調(diào)用collection.get()方法,傳入一個(gè)id或者cid從集合中檢索一個(gè)模型:

    
        app.MenuModel = Backbone.Model.extend({
               defaults: {
                   title: 'this is a menu',
                   status: 'inactive'
               }
            });
        app.MenuCollection = Backbone.Collection.extend({
              model: app.MenuModel,
              initialize: function() {
                  console.log('集合初始化成功');
              }
        });
        var menus = [
            {
                id: 1,
                name: '最近會(huì)話',
                status: 'active'
            },
            {
                id: 2,
                name: '通訊錄',
                status: 'inactive'
            }
        ]
        app.menus = new app.MenuCollection(menus);
        var a = app.menus.get(1);
        var b = app.menus.get('c2');
        console.log(a === b); //true
    

    關(guān)于模型的id秩霍、cid滚朵、idAttribute屬性可以參考上一篇文章Backbone入門(mén)之集合

  • at()

    調(diào)用collection.at()方法,傳入模型在集合中的索引值前域,at始終根據(jù)模型在插入集合時(shí)的索引返回值:

        
        var a = app.menus.get(1);
        var c = app.menus.at(0);
        console.log(a === c); //true
    
  • where()

    調(diào)用collection.where()方法,傳入模型屬性韵吨,返回符合的模型數(shù)組:

    
        var d = app.menus.where({name: '最近會(huì)話'});
        console.log(d);
    

    打印值如下:

    where
  • findWhere()

    findWhere()方法與where()方法調(diào)用方式一樣匿垄,只是findWhere()方法返回匹配傳入屬性的第一個(gè)模型,而不是返回一個(gè)模型數(shù)組:

    
        var d = app.menus.where({name: '最近會(huì)話'});
        console.log(d);
    

重置刷新集合

  • set()

    Backbone不僅支持添加或移除模型归粉,還提供一次性更新整個(gè)集合:調(diào)用Collection.set()方法椿疗,接收一個(gè)模型數(shù)組,將執(zhí)行更新集合所必要的添加糠悼、移除和更新操作届榄。

    如果列表中的一個(gè)模型尚不在集合中,那么它將被添加; 如果模型已經(jīng)在集合中倔喂,其屬性將被合并; 并且如果集合包含不存在于列表中的任何模型铝条,他們將被刪除。 以上所有將觸發(fā)相應(yīng)的"add", "remove", 和 "change"事件席噩。 返回集合中的模型班缰。另外 可以設(shè)置選項(xiàng):{add: false}, {remove: false}, 或 {merge: false},將相應(yīng)操作禁用悼枢,實(shí)現(xiàn)自定義行為埠忘。

    
        app.MenuModel = Backbone.Model.extend({
               defaults: {
                   title: 'this is a menu',
                   status: 'inactive'
               }
           });
        app.MenuCollection = Backbone.Collection.extend({
            model: app.MenuModel,
            initialize: function() {
                console.log('集合初始化成功');
            }
        });
        var menus = [
            {
                id: 1,
                name: '最近會(huì)話',
                status: 'active'
            },
            {
                id: 2,
                name: '通訊錄',
                status: 'inactive'
            }
        ]
        app.menus = new app.MenuCollection(menus);
        app.menus.set([
            {id:1, name: '最近聊天'},
            {id:3, name: '公告'}
        ]);
        console.log(app.menus.length); //2
        console.log(app.menus);
    

    打印值如下:

    刷新集合
    
        app.menus = new app.MenuCollection(menus);
        app.menus.set([
            {id:1, name: '最近聊天'},
            {id:3, name: '公告'}
        ], {remove: false});
        console.log(app.menus.length); //3
    
  • reset()

    調(diào)用Collection.reset()方法,可以重置整個(gè)集合:

    
        app.MenuModel = Backbone.Model.extend({
               defaults: {
                   title: 'this is a menu',
                   status: 'inactive'
               }
           });
        app.MenuCollection = Backbone.Collection.extend({
            model: app.MenuModel,
            initialize: function() {
                console.log('集合初始化成功');
                this.on('reset', function(cols, options) {
                    console.log(cols, options.previousModels);
                });
            }
        });
        var menus = [
            {
                id: 1,
                name: '最近會(huì)話',
                status: 'active'
            },
            {
                id: 2,
                name: '通訊錄',
                status: 'inactive'
            }
        ]
        app.menus = new app.MenuCollection(menus);
        app.menus.reset([
            {id:1, name: '最近聊天'}
        ]);
        console.log(app.menus.length); //1
    

    打印值如下:


    Collection.reset()

    調(diào)用Collection.reset()方法不會(huì)觸發(fā)add和remove事件馒索,但會(huì)觸發(fā)reset事件莹妒,我們可以通過(guò)傳入空參數(shù)來(lái)清空集合;監(jiān)聽(tīng)reset事件時(shí)可以從options.previousModels訪問(wèn)之前的模型數(shù)組绰上。

事件監(jiān)聽(tīng)

集合是模型的有序組合旨怠,在集合中添加或移除模型時(shí)會(huì)觸發(fā)add或remove事件,我們可以監(jiān)聽(tīng)這些事件渔期,進(jìn)行相應(yīng)數(shù)據(jù)邏輯處理运吓;同時(shí)渴邦,可以在集合的任意模型屬性上綁定change事件,監(jiān)聽(tīng)模型屬性的變化拘哨。

一般谋梭,事件監(jiān)聽(tīng)在集合初始化時(shí)綁定,第一個(gè)參數(shù)為監(jiān)聽(tīng)事件類型倦青,第二個(gè)參數(shù)為監(jiān)聽(tīng)回調(diào)瓮床,第三個(gè)參數(shù)為回調(diào)的上下文環(huán)境(可選),通常傳入指向當(dāng)前集合的this产镐。


    app.MenuModel = Backbone.Model.extend({
           defaults: {
               title: 'this is a menu',
               status: 'inactive'
           }
    });
    app.MenuCollection = Backbone.Collection.extend({
        model: app.MenuModel,
        initialize: function() {
            console.log('集合初始化成功');
            this.on('reset', function(cols, options) {
                console.log('重置集合');
            }, this);
            this.on('add', function(model) {
                console.log('添加模型隘庄,cid: ' + model.cid);
            }, this);
             this.on('change', function(model) {
                console.log('模型屬性改變?yōu)? ' + model.get(name'));
            });
            this.on('change:name', function(model) {
                console.log('模型name屬性改變?yōu)? ' + model.get('name'));
            });
            this.on('remove', function(model) {
                console.log('移除模型: ' + model.cid);
            });
        }
    });
    var menus = [
        {
            id: 1,
            name: '最近會(huì)話',
            status: 'active'
        },
        {
            id: 2,
            name: '通訊錄',
            status: 'inactive'
        }
    ]
    app.menus = new app.MenuCollection(menus);
    app.menus.set([
        {id:1, name: '最近聊天'},
        {id:3, name: '公告'}
    ]);
    app.menus.reset([
        {id:1, name: '最近聊天'}
    ]);
    
    //logs:
    //模型name屬性改變?yōu)? 最近聊天 
    //模型屬性改變?yōu)? 最近聊天
    //移除模型: c3 
    //添加模型,cid: c4 
    //重置集合 

Backbone事件除了上文的on()方法癣亚,還可以使用once()方法丑掺,與jQuery的once類似,監(jiān)聽(tīng)回調(diào)只執(zhí)行一次述雾。

關(guān)于Backbone.Collection集合的主要基礎(chǔ)內(nèi)容就闡述到這里街州,下一篇繼續(xù)學(xué)習(xí)Backbone的視圖(Backbone.View)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玻孟,一起剝皮案震驚了整個(gè)濱河市唆缴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌黍翎,老刑警劉巖面徽,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異匣掸,居然都是意外死亡趟紊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)碰酝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)织阳,“玉大人,你說(shuō)我怎么就攤上這事砰粹∵蠖悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵碱璃,是天一觀的道長(zhǎng)弄痹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嵌器,這世上最難降的妖魔是什么肛真? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮爽航,結(jié)果婚禮上蚓让,老公的妹妹穿的比我還像新娘乾忱。我一直安慰自己,他們只是感情好历极,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布窄瘟。 她就那樣靜靜地躺著,像睡著了一般趟卸。 火紅的嫁衣襯著肌膚如雪蹄葱。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天锄列,我揣著相機(jī)與錄音图云,去河邊找鬼。 笑死邻邮,一個(gè)胖子當(dāng)著我的面吹牛竣况,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筒严,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼帕翻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了萝风?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤紫岩,失蹤者是張志新(化名)和其女友劉穎规惰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體泉蝌,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歇万,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勋陪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贪磺。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诅愚,靈堂內(nèi)的尸體忽然破棺而出寒锚,到底是詐尸還是另有隱情,我是刑警寧澤违孝,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布刹前,位于F島的核電站,受9級(jí)特大地震影響雌桑,放射性物質(zhì)發(fā)生泄漏喇喉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一校坑、第九天 我趴在偏房一處隱蔽的房頂上張望拣技。 院中可真熱鬧千诬,春花似錦、人聲如沸膏斤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掸绞。三九已至泵三,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衔掸,已是汗流浹背烫幕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敞映,地道東北人较曼。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像振愿,于是被迫代替她去往敵國(guó)和親捷犹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容