亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Backbone.js中的集合詳解

2019-11-20 13:24:35
字體:
來源:轉載
供稿:網友

Backbone.js的集合只是一個簡單的有序集的模型。通過適應模型和集合,我們可以避免數據處理邏輯放到了我們的視圖層。此外,模型和集合還提供了便利的與后端一起工作的方法,當數據發生變化時,可以自動化地標記Backbone.js視圖。這樣,它可以用于如下的情況:

復制代碼 代碼如下:

Model: Animal, Collection: Zoo

通常情況下你的集合只適應一種模型,但模型本身并不局限于集合的類型。
復制代碼 代碼如下:

Model: person, Collection: Office
Model: person, Collection: Home

下面是常見的模型/集合的例子:
復制代碼 代碼如下:

var Music = Backbone.Model.extend({
      initialize: function(){
          console.log("Welcome to the music world");
      }
});
var Album = Backbone.Collection.extend({
    model: Music
});

上面的代碼告訴我們如何創建集合。但是它沒有告訴我們用數據操縱集合的過程。因此,讓我們探索這個過程:

復制代碼 代碼如下:

var Music = Backbone.Model.extend({
        defaults: {
            name: "Not specified",
            artist: "Not specified"
        },
        initialize: function(){
            console.log("Welcome to the music world ");    }
    });
    var Album = Backbone.Collection.extend({
        model: Music
    });
    var music1 = new Music ({ id: 1 ,name: "How Bizarre", artist: "OMC" });
    var music 2 = new Music ({id: 2,  name: "What Hurts the Most", artist: “Rascal Flatts" });
    var myAlbum = new Album([music 1, music 2]);
    console.log( myAlbum.models );

下面我們來看看Backbone.js的集合和其它組件的關系:

一、添加模型到集合

正如我們所知的那樣,集合是模型的集合。因此,我們可以在集合上添加模型。要添加模型到集合,我們可以使用add方法。我們還可以添加模型到集合的開始――通過使用unshift方法。

復制代碼 代碼如下:

var music3 = new Music({ id: 3, name: "Yes I Do",artist:“Rascal Flatts"  });
Music.add(music3);
console.log('New Song Added');
console.log(JSON.stringify(Music));

二、從集合中移除模型

很多時候,我們會有從集合中移除一些指定的數據這樣的需求。要從集合中移除模型,我們需要提供模型的id。如果我們想用一個完整的新數據集替換原集合,我們可以使用reset方法。

復制代碼 代碼如下:

Music.remove(1);
console.log('How Bizarre removed...');
console.log(JSON.stringify(Music));

三、Get和Set

如果我們需要從代碼其它地方的集合中獲取一個值,那么可以直接使用get方法。此時,我們向帶檢索的模型傳遞ID值。

復制代碼 代碼如下:

console.log(JSON.stringify(Music.get(2)));

集合的set方法有一個有趣的實現。set方法通過傳遞模型列表,執行集合的“智能”更新。如果列表中的模型還不在集合中,那么會添加到集合。如果模型已經在集合中,那么它的屬性會被合并。如果集合包含了不屬于列表的任意模型,那么這項模型會被移除。
復制代碼 代碼如下:

var Music = Backbone.Model.extend({
        // This attribute should be set as a default
        defaults: {
            Name: ''
        },
        // Set the id attribute so that the collection        
        idAttribute: 'id'
    });
    var song = Backbone.Collection.extend({
        model: Music
    });
    var models = [{
        Name: 'OMC',
        id: 1
    }, {
        Name: 'Flatts',
        id: 2
    }];
    var collection = new song(models);
    collection.bind('add', function (model) {
        alert('addb')
    });
    collection.bind('remove', function () {
        alert('add')
    });
    models = [{
        Name: 'OMC',
        id :1
    }, {
        Name: 'Flatts',
        id: 2
    }, {
        Name: ' Jackson ',
        id: 3
    }];
    collection.add(models);
});

正如我們在上面所看到的那樣,事前我們已經有2個模型了,當我們添加第3個模型時,早先的模型保持不變。

四、構造器與初始化

當我們創建一個集合時,我們可以傳遞模型的初始化數組。集合的比較器可以作為一個選項被加入。如果傳遞的比較器選項是false,那么會阻止排序。如果我們定義了一個初始化函數,那么此函數會在集合創建時被調用。下面說明了幾個選項,如果提供了,會直接加到集合上:模型和比較器。

復制代碼 代碼如下:

var tabs = new TabSet([tab1, tab2, tab3]);
var spaces = new Backbone.Collection([], {
  model: Space
});

五、toJSON

toJSO方法返回集合中包含哈每個模型哈希屬性的數組。此方法通常用于對集合整體做序列化和持久化。

復制代碼 代碼如下:

var song = new Backbone.Collection([
  {name: "Flatts"},
  {name: "OMC"},
  {name: "Jackson"}
]);
alert(JSON.stringify(song));

六、比較器Comparator

默認情況下,集合是不帶比較器的。如果我們定義了一個比較器,它可以用于讓集合維持某種排序。這意味著在添加模型時,模型會被插入到集合中適合的位置。比較器可以用sortBy定義,或以字符串的方式指示排序的屬性。

sortBy比較器函數得到一個模型,并返回一個數字或字符串。

sort比較器函數得到兩個模型,如果第一個模型先于第二個模型,那么返回-1;如果兩個模型同級,那么返回0;如果第二個模型先于第一個模型,那么返回1。

下面我們來看看例子:

復制代碼 代碼如下:

var student  = Backbone.Model;
var students = new Backbone.Collection;
students.comparator = 'name';
students.add(new student({name: "name1", roll: 9}));
students.add(new student({name: "name2", roll: 5}));
students.add(new student({name: "name3", roll: 1}));
alert(students.pluck('roll'));

待比較器的集合不會自動重排序,即使我們修改了模型的屬性。因此我們應該在修改了模型屬性后估計會影響到排序時,調用排序。

七、排序

當集合中添加模型時,應強制集合進行重新排序。當集合添加模型時要禁用排序,可以傳遞{sort: false}參數。調用排序的觸發器會檢查此參數。

復制代碼 代碼如下:

sortByType: function(type) {
  this.sortKey = type;
  this.sort();
}

以及視圖函數:
復制代碼 代碼如下:

sortThingsByColumn: function(event) {
  var type = event.currentTarget.classList[0]
  this.collections.things.sortByType(type)
  this.render()
}

八、采摘

Pluck:從集合中的每個模型采摘一個屬性,這等同于從迭代器調用Map并返回單一屬性。

復制代碼 代碼如下:

var song = new Backbone.Collection([
  {name: "Flatts"},
  {name: "OMC"},
  {name: "Jackson"}
]);
var names = songs.pluck("name");
alert(JSON.stringify(names));

九、Where

where:返回集合中所有匹配傳遞的屬性的模型的數組,使用了過濾器。

復制代碼 代碼如下:

var song = new Backbone.Collection([
  {name: "Yes I Do",      artist: "Flatts"},
  {name: "How Bizarre",    artist: "How Bizarre"},
  {name: "What Hurts the Most",     artist: "Flatts"},
  ]);
var artists = song.where({artist: "Flatts"});
alert(artists.length);

十、URL
在集合中設置URL屬性,會引用服務器的位置。集合內的模型會使用此URL來構造自己的URL。
復制代碼 代碼如下:

var Songs = Backbone.Collection.extend({
  url: '/songs'
});
var Songs = Backbone.Collection.extend({
  url: function() {
    return this.document.url() + '/songs';
  }
});

十一、解析
Parse:在提取fetch時被Backbone調用,無論服務器是否返回集合的模型。此函數會傳遞原始的響應對象,他應該返回被添加到集合的模型屬性的數組。默認的實現是空操作no-op。簡單的通過JSON響應傳遞,用先前存在的API覆蓋此操作,或更好的命名空間響應。
復制代碼 代碼如下:

var songs = Backbone.Collection.extend({
    parse: function(response) {
    return response.results;
  }
});

十二、提取
Fetch:從服務器提取集合默認的模型集,當取回后在集合中設置它們。此選項哈希接受success或錯誤回調,他傳遞(集合、響應、選項)三個參數。然后從服務器返回模型數據。它用于設置合并提取的模型。
復制代碼 代碼如下:

Backbone.sync = function(method, model) {
  alert(method + ": " + model.url);
};
var songs = new Backbone.Collection;
songs.url = '/songs';
songs.fetch();

正如上面所看到的,僅僅是Backbone的集合就有那么多的方法,掌握它們才能提高代碼的質量。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97av在线播放| 8x海外华人永久免费日韩内陆视频| 精品日韩视频在线观看| 日韩av一区二区在线| 日韩va亚洲va欧洲va国产| 青青青国产精品一区二区| 欧美一区三区三区高中清蜜桃| 欧美亚洲日本网站| 国产成人精品免费久久久久| 精品国内自产拍在线观看| 日韩中文字幕免费视频| 久久久久久久999精品视频| 日韩av电影中文字幕| 精品国产一区二区三区久久狼5月| 亚洲欧美成人精品| 国产伦精品一区二区三区精品视频| 欧美激情一二三| 亚洲日韩中文字幕在线播放| 精品成人国产在线观看男人呻吟| 国产视频精品免费播放| 久久精品国亚洲| 亚洲欧美国产精品久久久久久久| 97视频人免费观看| 久久免费少妇高潮久久精品99| 久久综合国产精品台湾中文娱乐网| 成人黄色免费片| 亚洲美女精品久久| 国产成人精品一区| 久久久久久久久久久成人| 亚洲乱码一区av黑人高潮| 北条麻妃一区二区三区中文字幕| 国产精品久久久久久av福利软件| 国产激情久久久久| 日韩成人中文电影| 日韩在线www| 国内精品视频在线| 5566成人精品视频免费| 性色av一区二区三区免费| 国内成人精品一区| 97成人超碰免| 国产亚洲精品美女| 日韩电影免费观看中文字幕| 国产在线久久久| 色播久久人人爽人人爽人人片视av| 爽爽爽爽爽爽爽成人免费观看| 日韩成人在线网站| 亲爱的老师9免费观看全集电视剧| 国产精品日韩一区| 亚洲品质视频自拍网| 久色乳综合思思在线视频| 亚洲小视频在线| 成人激情视频在线播放| 亚洲自拍偷拍在线| 精品一区电影国产| 日韩欧美极品在线观看| 亚洲天堂网站在线观看视频| 中文字幕亚洲第一| 日韩精品免费在线播放| 精品成人乱色一区二区| 亚洲第一福利视频| 5252色成人免费视频| 国产97免费视| 欧美激情国产精品| 欧美午夜激情在线| 日韩专区在线播放| 中文字幕亚洲一区| 国产脚交av在线一区二区| 色偷偷av一区二区三区乱| 久久久av网站| 久久成年人免费电影| 狠狠综合久久av一区二区小说| 国产精品爱久久久久久久| 欧美电影在线免费观看网站| 成人国产在线视频| 成人在线一区二区| 久久人人看视频| 久久亚洲精品中文字幕冲田杏梨| 亚洲福利在线观看| 亚洲精品白浆高清久久久久久| 91九色精品视频| 久久久久久久久久久久久久久久久久av| 97视频在线观看播放| 欧美一级片在线播放| 亚洲综合日韩中文字幕v在线| 韩国三级日本三级少妇99| 国产精选久久久久久| 亚洲欧美国产精品久久久久久久| 57pao国产精品一区| 亚洲精品动漫久久久久| 日韩在线观看高清| 亚洲成人久久一区| 九九视频直播综合网| 国产中文字幕亚洲| 欧美激情视频网站| 插插插亚洲综合网| 夜夜嗨av色综合久久久综合网| 成人97在线观看视频| 亚洲石原莉奈一区二区在线观看| 亚洲一区国产精品| 日韩av免费在线播放| 亚洲视频免费一区| 亚洲香蕉成人av网站在线观看| 欧美精品在线播放| www.亚洲一二| 国产精品视频专区| 欧美在线激情网| 亚洲伊人久久大香线蕉av| 国产精品高潮呻吟久久av无限| 日韩女优人人人人射在线视频| 欧美丝袜一区二区| 欧美电影在线观看网站| 亚洲桃花岛网站| 青青在线视频一区二区三区| 日韩在线视频观看正片免费网站| 欧美成人免费全部观看天天性色| 九色成人免费视频| 久久久在线免费观看| 亚洲人成欧美中文字幕| 国产成人精品一区二区三区| 中文字幕不卡在线视频极品| 国产热re99久久6国产精品| 成人精品久久一区二区三区| 国产成人精品久久二区二区91| 日韩精品免费在线视频观看| 国产精品爽黄69| 成人一区二区电影| 57pao成人国产永久免费| 国产精品久久久久99| 国产精品一区二区久久国产| 欧美日产国产成人免费图片| 95av在线视频| 国产精品激情av在线播放| 2020国产精品视频| 精品久久久国产| 亚洲欧美制服另类日韩| 亚洲福利视频免费观看| 欧美在线激情网| 日韩亚洲一区二区| 欧美激情乱人伦| 亚洲一区二区久久久久久| 91精品久久久久久久久青青| 68精品久久久久久欧美| 国产丝袜精品第一页| 一区二区成人精品| 青青草原成人在线视频| 欧美日韩免费网站| 亚洲美女性生活视频| 高潮白浆女日韩av免费看| 成人精品久久一区二区三区| 国产精品视频精品| 欧美精品www| 久久久久久久激情视频| 2019av中文字幕| 国产成人福利视频| 日韩av在线影院| 秋霞成人午夜鲁丝一区二区三区| 亚洲人成在线免费观看| 91精品久久久久久久| 成人黄色激情网| 亚洲国产精品成人精品| 91黑丝在线观看| 国产精品国产亚洲伊人久久| 国产精品成人一区二区三区吃奶| 久久中文字幕在线视频|