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 );
一、添加模型到集合
正如我们所知的那样,集合是模型的集合。因此,我们可以在集合上添加模型。要添加模型到集合,我们可以使用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)));
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); });
四、构造器与初始化
当我们创建一个集合时,我们可以传递模型的初始化数组。集合的比较器可以作为一个选项被加入。如果传递的比较器选项是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:返回集合中所有匹配传递的属性的模型的数组,使用了过滤器。
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);
var Songs = Backbone.Collection.extend({ url: '/songs' }); var Songs = Backbone.Collection.extend({ url: function() { return this.document.url() + '/songs'; } });
var songs = Backbone.Collection.extend({ parse: function(response) { return response.results; } });
Backbone.sync = function(method, model) { alert(method + ": " + model.url); }; var songs = new Backbone.Collection; songs.url = '/songs'; songs.fetch();
正如上面所看到的,仅仅是Backbone的集合就有那么多的方法,掌握它们才能提高代码的质量。
问题内容: 我有2个模型和1个收藏集。是一个模型,是项目的集合,然后我有一个模型,其中包含: 当我调用该对象时,它得到了所有东西…除了当我在集合中移动时,它们都是类型而不是类型。 我认为这是有道理的,因为除了对象之外,它不知道the 的类型应该是。我可以遍历每个项目并将其转换为对象,但是我希望有一种无需手动进行操作的方法。 这是我的测试代码(在这里使用jsfiddle): 更新:我想到我可以覆盖解
问题内容: 我有一个REST Json API,它返回一个列表“ logbooks”。有许多实现不同但相似行为的日志。在数据库层的服务器端实现是一种单表继承,因此日志的每个JSON表示都包含其“类型”: 我想在客户端复制此服务器模型,所以我有一个基类和多个日志子类: 我的是一组用于查询JSON API的模型: 当我获取日志集合时,是否有一种方法可以将每个对象转换为其对应的子类(基于JSON“ ty
本文向大家介绍java集合中的list详解,包括了java集合中的list详解的使用技巧和注意事项,需要的朋友参考一下 1、List接口 该接口定义的元素是有序的且可重复的。相当于数学里面的数列,有序可重复 booleanaddAll(intindex,Collection<?extendsE>c);将指定集合中所有元素,插入至本集合第index个元素之后defaultvoidreplaceAll
请读到最后(我在最后提到console.log) 模型: 收藏: 观点: 在我们的应用程序中。js 服务器输出 我还尝试从模型中删除所有属性防御。还是不行。返回值内容类型为:application/json(已验证),并且是有效的json。 我读过:Backbonejs集合长度总是零 但尽管console.log,显示0长度,也: 不工作! 我还读了Did主干收集自动解析加载的数据 非常感谢 更新
本文向大家介绍Javascript MVC框架Backbone.js详解,包括了Javascript MVC框架Backbone.js详解的使用技巧和注意事项,需要的朋友参考一下 随着JavaScript程序变得越来越复杂,往往需要一个团队协作开发,这时代码的模块化和组织规范就变得异常重要了。MVC模式就是代码组织的经典模式。 (……MVC介绍。) (1)Model Model表示数据层,也就是程
本文向大家介绍详解ES6中的Map与Set集合,包括了详解ES6中的Map与Set集合的使用技巧和注意事项,需要的朋友参考一下 集合的概念以及和数组的区别 其实数组也是集合, 只不过数组的索引是数值类型.当想用非数值类型作为索引时, 数组就无法满足需要了. 而 Map 集合可以保存多个键-值对(key-value), Set 集合可以保存多个元素. 对Map 和 Set 一般不会逐一遍历其中的元