05Backbone系列

创建集合

集合就是用来存储和管理一系列相同类型的模型,相同类型,指的是它们有相同的字段。模型和集合的结合有多种方式,需要多想想

  1. 创建集合
// 模型
var Book = Backbone.Model.extend({
    defaults: {
        name: ''
    }
});
// 集合
var BookList = Backbone.Collection.extend({
    model: Book
});
// 创建一系列模型对象
var book1 = new Book({
    name: 'Effective Java'
});
var book2 = new Book({
    name: 'java and javascript'
});
// 创建集合对象
// 参数是数组,不是对象
var books = new BookList([book1,book2]);
  1. 模型对象有clone方法。和上面的方式,大同小异
// 模型
var Book = Backbone.Model.extend({
    defaults: {
        name: ''
    }
});
// 集合
var BookList = Backbone.Collection.extend({
    model: Book
});
// 使用另一种方式创建模型对象而已
var book1 = new Book({  
    name : 'Effective Java中文版(第2版)'  
});  
var book2 = book1.clone();  
book2.set('name', 'JAVA核心技术卷II:高级特性(原书第8版)');  
// 创建集合对象
var books = new BookList([book1,book2]);
  1. 利用 数据 和 模型类 创建集合对象。较为不同,当你使用 Collection 只是为了管理数据,不需要扩展其他自定义方法,使用这种创建方式即可。这中方式在项目中最常用。
// 创建 模型类
var Books = Backbone.Model.extend({
    dafaults: {
        name: ''
    }
});
// 定义数据
var models = [
    {name:'java'},
    {name:'javascript'}
]
// 利用 数据 和 模型类 创建集合对象
var books = new Backbone.Collection(models,{
    model: Book
});

补充:id 和 cid

  1. id是前端为每个模型设置的,没有设置则没有
  2. cid是所有model创建时自动生成的唯一标识符

向集合中添加模型

集合操作中,第二个参数的at项会覆盖方法原本的位置

  1. add(),可以添加一个模型或者一个模型数组
  2. push(),尾部添加
  3. unshift(),头部添加
  4. 当模型对象被添加到集合中,会触发集合的add事件。除非设置了silent配置项。
// 创建集合对象
var books = new BookList(models,{
    model: Book
})
// 集合对象使用以上方法
books.add({
    name: '构建高性能的web网站'
});
books.push({  
    name : 'Web富应用开发',  
}, {  
    at : 1  
}); 

删除模型

  1. remove,删除一个模型或一个模型数组
  2. pop,删除尾部一个模型并返回
  3. shift,删除头部一个模型并返回
  4. 删除模型后,会触发集合的remove事件。除非设置了silent配置项。
books.remove(books.models[2]);
books.pop();
books.shift();

集合中查找模型

  1. 四种不同的查找方式
  2. where这种查找方式,数据可以是模型对象的一部分或全部。结果是一个数组。
// get,通过id查找模型对象
var book1 = books.get(1001);
// geiByCid, 通过cid查找模型对象
var book2 = books.getByCid('c1');
// at, 查找对应下标的模型对象
var book3 = books.at(0);
// where, 根据数据查找模型对象数组
var bookArr = books.where({
    name: 'java'
});

自动排序

自动排序在模型对象较多的时候,消耗较大。比如,每次插入,为了保持数据排序,都会调用。同时,插入方法指定的位置不起作用。因此,此时可以使用sort排序。

// 在创建集合对象的时候,同时添加上`comparator`选项,该选项定义排序规则,使用方式和sort一样
var BookList = Backbone.Collection.extend({
    model: Book,
    comparator: function (m1,m2) {
        var price1 = m1.get('price');  
        var price2 = m2.get('price');  
  
        if(price1 > price2) {  
            return 1;  
        } else {  
            return 0;  
        }  
    }
}); 

从服务器获取数据

有两个与服务器进行交互的方法

// 从服务器中拉取数据
books.fetch({  
    add: true,
    success: function(collection, resp) {  
        // 同步成功后在控制台输出集合中的模型列表  
        console.dir(collection.models);  
    }  
}); 
// 创建一个模型  
books.create({  
    name : 'Thinking in Java',  
    price : 395.70  
}, {  
    success : function(model, resp) {  
        // 添加成功后, 在控制台输出集合中的模型列表  
        console.dir(books.models);  
    }  
}); 
  1. 拉取数据会覆盖原来的集合上的模型,因此,如果想要不覆盖,需要添加add:true的配置.同时fetch之后会触发集合的reset事件,还有request,sync/error
  2. 创建模型的时候,会先将创建的对象添加到集合中,再提交到服务器。可以通过配置wait,来控制只有在服务器返回200状态码的时候,才将模型对象添加到集合中。会触发集合的add事件,还有request,sync/error

数据批量同步到服务器

collection拿到数据之后,还需要手动的添加到各个模型中

  1. 在博客中,提供了一个方法,在reset事件中进行批量同步
  2. 在项目中,使用sync等事件进行同步
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,849评论 6 13
  • 翻译自“Collection View Programming Guide for iOS” 0 关于iOS集合视...
    lakerszhy阅读 3,810评论 1 22
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,207评论 0 2
  • 你拍过大头贴吗?当年和你一起拍大头贴的人现在怎么样了?我把话题直接扔到了同学群里,本来一个个潜水的深井冰全部出来撒...
    米布私人档案馆阅读 1,178评论 5 1