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 ...
随机推荐
- mybatis由浅入深day01_1课程安排_2对原生态jdbc程序中问题总结
mybatis 第一天 mybatis的基础知识 1 课程安排: mybatis和springmvc通过订单商品 案例驱动 第一天:基础知识(重点,内容量多) 对原生态jdbc程序(单独使用jdbc开 ...
- Swift - UITableView的用法
因为倾向于纯代码编码,所以不太喜欢可视化编程,不过也略有研究,所以项目里面的所有界面效果,全部都是纯代码编写! 终于到了重中之重的tableview的学习了,自我学习ios编程以来,工作中用得最多的就 ...
- url重写(urlrewrite)的一些系统变量
学php也有3年了,一直对url重写不是很了解,本学用到的话都是百度一下,再复制作简单修改,一些变量的参数都不太了解什么意思,难得今天有时间,做个笔记吧! 1)可用的一些系统变量,在重写条件和重写规则 ...
- PHP webservice 接口实例
原文地址,就不摘抄了 http://www.sky00.com/archives/91.html
- LNMP 配置二级域名
准备: 已备案的主域名,例如:www.test.com 拥有自己的服务器 服务器环境 LNMP 目标: 配置一个二级域名: bbs.test.com 1 登录域名后台(阿里为例) 记录类型: A 主机 ...
- web基础----->模板引擎Velocity的使用(二)
这里面是关于velocity的一些用法,比较基础的使用.愿你生命中有够多的云翳,来造成一个美丽的黄昏. velocity生成javaBean 一.定义一个简单的bean类 public class C ...
- Java多线程详解(三)
1)死锁 两个线程相互等待对方释放同步监视器时会出现死锁的现象,这时所有的线程都处于阻塞状态,程序无法继续向下执行. 如下就是会出现死锁的程序. 首先flag = 1,线程d1开始执行,锁住对象o1, ...
- 【Android】Android Theme的设置
在AndroidManifest.xml文件中,可以对每一个Activity设置android:theme theme的设置 可以设置为系统自带的格式,也可以自定义格式. A: 系统自带格式 @and ...
- struts2的占位符*在action中的配置方法
转自:https://blog.csdn.net/u012546338/article/details/68946633 在配置<action> 时,可以在 name,class,meth ...
- 整数快速幂hdu(1852)
hdu1852 Beijing 2008 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/65535 K (Java/Others ...