2.8 The Object Model -- Enumerables
在Ember.js中,枚举是包含许多子对象的任何对象,并允许你使用Ember.Enumerable API和那些子对象一起工作。在大部分应用程序中最常见的可枚举是本地JS数组,Ember.js扩展到符合可枚举接口。
通过提供一个标准化的接口处理来可枚举,ember.js让你彻底改变存储的底层数据的方式而无需修改应用程序的其他部分获取它。
可枚举的API尽可能遵循ECMAScript标准。这样最大限度的减少与其他库的不兼容,并允许Ember.js在数组中使用原生的浏览器实现。
例如,所有的可枚举支持标准的forEach方法:
[1,2,3].forEach(function(item) {
console.log(item);
});
//=> 1
//=> 2
//=> 3
通常,可枚举的方法,例如forEach,第二个参数是可选的,这个回调函数中将变成this的值在。
var array = [1,2,3];
array.forEach(function(item) {
console.log(item, this.indexOf(item));
}, array)
//=> 1 0
//=> 2 1
//=> 3 2
一、Enumberables in Ember.js
通常,对象表示列表实现枚举器接口。
examples:
- Array -- Ember使用可枚举的接口扩展JS原生的Array(除非你禁用属性扩展)
- Ember.Set -- 一个数据结构,它可以有效回答是否它包含一个对象。
二、API概览
下面我们会探讨一些最常见的可枚举的便利。
1. Iterating Over An Enumerable(迭代)
使用forEach方法枚举所有可枚举对象的值:
var food = ["Poi", "Ono", "Adobo Chicken"];
food.forEach(function(item, index) {
console.log('Menu Item %@: %@'.fmt(index+1, item));
});
// Menu Item 1: Poi
// Menu Item 2: Ono
// Menu Item 3: Adobo Chicken
2. Making An Array Copy
通过调用toArray()方法你可以制作一个任何实现了Ember.Enumerable的对象的原生数组的拷贝。
var states = Ember.Set.create();
states.add("Hawaii");
states.add("California")
states.toArray()
//=> ["Hawaii", "California"]
注意在许多的可枚举中,例如例子中使用的Ember.Set,所得到的数组的顺序是没有保证的。
3. First and Last Objects
所有的枚举接口暴露firstobject和lastobject属性可以绑定。
var animals = ["rooster", "pig"];
animals.get('lastObject');
//=> "pig"
animals.pushObject("peacock");
animals.get('lastObject');
//=> "peacock"
4. Map
使用Map()方法你可以很容易地变化可枚举中的每一项,它可以调用每一项上回调函数的结果来创建一个新数组。
var words = ["goodbye", "cruel", "world"];
var emphaticWords = words.map(function(item) {
return item + "!";
});
// ["goodbye!", "cruel!", "world!"]
如果可枚举的是合成的,会有一个mayBy()方法,它将反过来从这些对象中的每一项中提取指定的属性并返回一个新数组。
var hawaii = Ember.Object.create({
capital: "Honolulu"
});
var california = Ember.Object.create({
capital: "Sacramento"
});
var states = [hawaii, california];
states.mapBy('capital');
//=> ["Honolulu", "Sacramento"]
5. Filtering
另一个常见的任务是以枚举作为输入执行一个枚举,和基于一些条件过滤后返回一个数组。
对于任意的过滤,用过滤器方法。如果包含在最后的数组中,该过滤器的方法期望回调函数返回true,否则返回false或者undefined。
var arr = [1,2,3,4,5];
arr.filter(function(item, index, self) {
if (item < 4) { return true; }
})
// returns [1,2,3]
当使用一个集合对象时,通常需要根据某些属性的值来筛选一组对象。filterBy方法提供了一个快捷方式。
Todo = Ember.Object.extend({
title: null,
isDone: false
});
todos = [
Todo.create({ title: 'Write code', isDone: true }),
Todo.create({ title: 'Go to sleep' })
];
todos.filterBy('isDone', true);
// returns an Array containing only items with `isDone == true`
如果你只需要返回第一个匹配的值,而不是包含所有匹配的值的数组,你可以使用find和findBy,它们只返回一条数据。
6. Aggregate Information(All or Any)汇总信息
如果你想找到可枚举中的每一条数据都满足一些条件,你可以使用every方法。
Person = Ember.Object.extend({
name: null,
isHappy: false
});
var people = [
Person.create({ name: 'Yehuda', isHappy: true }),
Person.create({ name: 'Majd', isHappy: false })
];
people.every(function(person, index, self) {
if(person.get('isHappy')) { return true; }
});
// returns false
如果你想找到可枚举中的至少一条数据都满足一些条件,你可以使用some方法。
people.some(function(person, index, self) {
if(person.get('isHappy')) { return true; }
});
// returns true
就像过滤方法一样,every和some有类似的方法isEvery和isAny方法。
people.isEvery('isHappy', true) // false
people.isAny('isHappy', true) // true
2.8 The Object Model -- Enumerables的更多相关文章
- Selenium的PO模式(Page Object Model)[python版]
Page Object Model 简称POM 普通的测试用例代码: .... #测试用例 def test_login_mail(self): driver = self.driver driv ...
- 在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况
自从人类学会了使用火,烤制的方式替代了人类的消化系统部分功能,从此人类的消化系统更加简单,加速了人脑的进化:自从SharePoint 2010开始有了Client Side Object Model ...
- Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)
研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...
- 解决在使用client object model的时候报“object does not belong to a list”错误
在查看别人代码的时候,发现了个有意思的问题,使用client object model将一个文件check in 我使用的是如下语句获取file Microsoft.SharePoint.Client ...
- Page Object Model (Selenium, Python)
时间 2015-06-15 00:11:56 Qxf2 blog 原文 http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...
- SharePoint Client Object Model API 介绍以及工作原理解析
CSOM和ServerAPI 的对比 SharePoint从2010开始引入了Client Object Model的API(后文中用CSOM来代替),从名字来看,我们可以简单的看出,该API是面向客 ...
- BOM (Browser Object Model) 浏览器对象模型
l对象的角色,因此所有在全局作用域中声明的变量/函数都会变成window对象的属性和方法; // PS:尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的对象是否存 ...
- 文本对象模型(Document Object Model)
本文内容: 1. 概述 2. DOM中的节点类型 3. DOM节点的选取 4. 存取元素属性 5.DOM元素的增删 6.小结 ★ 概述 文本对象模型(DOM)是一个能够让程序和脚本动态访问和更新文档内 ...
- 浏览器对象模型(BOM,Browser Object Model)
本文内容 1.概述 2.windows与document 3.对话框 4.定时调用 5.URL解析与访问历史 6.浏览器和屏幕信息 ★概述 &q ...
随机推荐
- 超全面的JavaWeb笔记day01<HTML等>
1.html简介 - html的操作思想(*****) 2.文字标签和注释标签 3.标题标签.水平线标签和特殊字符 4.列表标签 5.图像标签(********) 6.路径介绍(相对路径*****) ...
- 06python 之基本数据类型
数字 int(整型) 在32位机器上,整数的位数为32位,取值范围为-2**31~2**31-1,即-2147483648~2147483646 在64位机器上,整数的位数为64位,取值范围为-2** ...
- 连接oracle服务器超慢--原因分析
连接oracle服务器超慢:有如下原因可能会影响. 网络不好:oracle服务器跟本地网络不好. oracle服务器内存不足:导致反应超慢 监听日志listener.log太大:导致响应超慢. 所以对 ...
- 最近maven开发中遇到的一些bug。
1.WebxContextLoaderListener 等tomcat启动报错.大部分原因都是jar包问题. 检查方式,在tomcat的webapps/WEB-INF/lib下有没有想对应的jar包 ...
- Dubbo(三) -- 多协议支持与多注册中心
一.Dubbo支持的协议 Dubbo协议.Hessian协议.HTTP协议.RMI协议.WebService协议.Thrift协议.Memcached协议.Redis协议 二.协议简介 详细参考:ht ...
- Redis(八)-- Redis分布式锁实现
一.使用分布式锁要满足的几个条件 系统是一个分布式系统(关键是分布式,单机的可以使用ReentrantLock或者synchronized代码块来实现) 共享资源(各个系统访问同一个资源,资源的载体可 ...
- MySQL性能优化(十)-- 主从复制(一主多从)
环境准备: Linux1(matser) Linux2(slave) Linux3(slave) 搭建 1.先清空原来的master和slave配置 reset master; 2.
- 管理开机启动:chkconfig
CentOS 6 如何设置服务开机启动: [root@localhost ~]$ ls /etc/init.d/httpd # /etc/init.d/目录下必须有启动脚本 [root@localho ...
- 如何快速入门单片机C语言
一.为什么要学单片机技术? 传统的电子产品升级改造成智能化的电子产品需要用到单片机技术.也就是说传统的电子产品如电视机.电子表.计算器.数码相机.手机.MP3.遥控器.洗衣机等产品智能化.微型化,需要 ...
- AVL树与红黑树
平衡树是平时经常使用数据结构. C++/JAVA中的set与map都是通过红黑树实现的. 通过了解平衡树的实现原理,可以更清楚的理解map和set的使用场景. 下面介绍AVL树和红黑树. 1. AVL ...