Backbone.js中的集合详解


Posted in Javascript onJanuary 14, 2015

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的集合和其它组件的关系:

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的集合就有那么多的方法,掌握它们才能提高代码的质量。

Javascript 相关文章推荐
JavaScript 无符号右移运算符
Apr 17 Javascript
js综合应用实例简单的表格统计
Sep 03 Javascript
JS实现鼠标单击与双击事件共存
Mar 08 Javascript
JS清除选择内容的方法
Jan 29 Javascript
深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
Mar 04 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
Oct 16 Javascript
jQueryUI Datepicker组件设置日期高亮
Oct 13 Javascript
vue.js实现单选框、复选框和下拉框示例
Jul 18 Javascript
详解.vue文件中监听input输入事件(oninput)
Sep 19 Javascript
Vue中的transition封装组件的实现方法
Aug 13 Javascript
Vue前端项目部署IIS的实现
Jan 06 Javascript
Vue实现简单计算器案例
Feb 25 Javascript
jquery增加和删除元素的方法
Jan 14 #Javascript
Node.js开源应用框架HapiJS介绍
Jan 14 #Javascript
jQuery中Ajax的load方法详解
Jan 14 #Javascript
jquery获取当前日期的方法
Jan 14 #Javascript
JavaScript 学习笔记之基础中的基础
Jan 13 #Javascript
jQuery 中DOM 操作详解
Jan 13 #Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
Jan 13 #Javascript
You might like
php 文件缓存函数
2011/10/08 PHP
基于session_unset与session_destroy的区别详解
2013/06/03 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
点击下载链接 弹出页面实现代码
2009/10/01 Javascript
js字符串截取函数substr substring slice使用对比
2013/11/27 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
JavaScript中string转换成number介绍
2014/12/31 Javascript
javascript禁止访客复制网页内容的实现代码
2015/08/05 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
jQuery.Callbacks()回调函数队列用法详解
2016/06/14 Javascript
详解vue 实例方法和数据
2017/10/23 Javascript
详解webpack编译多页面vue项目的配置问题
2017/12/11 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
jQuery使用$.extend(true,object1, object2);实现深拷贝对象的方法分析
2019/03/06 jQuery
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
解决ant design vue 表格a-table二次封装,slots渲染的问题
2020/10/28 Javascript
python sys模块sys.path使用方法示例
2013/12/04 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
对numpy中二进制格式的数据存储与读取方法详解
2018/11/01 Python
Python+OpenCV感兴趣区域ROI提取方法
2019/01/10 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
日本PLST在线商店:日本时尚杂志刊载的人气服装
2016/12/10 全球购物
德国著名廉价网上药店:Shop-Apotheke
2017/07/23 全球购物
JOSEPH官网:英国奢侈时尚品牌
2018/01/31 全球购物
博朗(Braun)俄罗斯官方商店:德国小家电品牌
2019/09/24 全球购物
工作疏忽检讨书
2014/01/25 职场文书
安全环保演讲稿
2014/08/28 职场文书
2014七年级班主任工作总结
2014/12/05 职场文书
离婚协议书范文
2015/01/26 职场文书
上诉答辩状范文
2015/05/22 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
oracle表分区的概念及操作
2021/04/24 Oracle