在Ember.js中,枚举是包含许多子对象的任何对象,并允许你使用Ember.Enumerable API和那些子对象一起工作。在大部分应用程序中最常见的可枚举是本地JS数组,Ember.js扩展到符合可枚举接口。

通过提供一个标准化的接口处理来可枚举,ember.js让你彻底改变存储的底层数据的方式而无需修改应用程序的其他部分获取它。

可枚举的API尽可能遵循ECMAScript标准。这样最大限度的减少与其他库的不兼容,并允许Ember.js在数组中使用原生的浏览器实现。

例如,所有的可枚举支持标准的forEach方法:

  1. [1,2,3].forEach(function(item) {
  2. console.log(item);
  3. });
  4.  
  5. //=> 1
  6. //=> 2
  7. //=> 3

通常,可枚举的方法,例如forEach,第二个参数是可选的,这个回调函数中将变成this的值在。

  1. var array = [1,2,3];
  2.  
  3. array.forEach(function(item) {
  4. console.log(item, this.indexOf(item));
  5. }, array)
  6.  
  7. //=> 1 0
  8. //=> 2 1
  9. //=> 3 2

一、Enumberables in Ember.js

通常,对象表示列表实现枚举器接口。

examples:

  • Array -- Ember使用可枚举的接口扩展JS原生的Array(除非你禁用属性扩展)
  • Ember.Set -- 一个数据结构,它可以有效回答是否它包含一个对象。

二、API概览

下面我们会探讨一些最常见的可枚举的便利。

1. Iterating Over An Enumerable(迭代)

使用forEach方法枚举所有可枚举对象的值:

  1. var food = ["Poi", "Ono", "Adobo Chicken"];
  2.  
  3. food.forEach(function(item, index) {
  4. console.log('Menu Item %@: %@'.fmt(index+1, item));
  5. });
  6.  
  7. // Menu Item 1: Poi
  8. // Menu Item 2: Ono
  9. // Menu Item 3: Adobo Chicken

2. Making An Array Copy

通过调用toArray()方法你可以制作一个任何实现了Ember.Enumerable的对象的原生数组的拷贝。

  1. var states = Ember.Set.create();
  2.  
  3. states.add("Hawaii");
  4. states.add("California")
  5.  
  6. states.toArray()
  7. //=> ["Hawaii", "California"]

注意在许多的可枚举中,例如例子中使用的Ember.Set,所得到的数组的顺序是没有保证的。

3. First and Last Objects

所有的枚举接口暴露firstobjectlastobject属性可以绑定。

  1. var animals = ["rooster", "pig"];
  2.  
  3. animals.get('lastObject');
  4. //=> "pig"
  5.  
  6. animals.pushObject("peacock");
  7.  
  8. animals.get('lastObject');
  9. //=> "peacock"

4. Map

使用Map()方法你可以很容易地变化可枚举中的每一项,它可以调用每一项上回调函数的结果来创建一个新数组。

  1. var words = ["goodbye", "cruel", "world"];
  2.  
  3. var emphaticWords = words.map(function(item) {
  4. return item + "!";
  5. });
  6. // ["goodbye!", "cruel!", "world!"]

如果可枚举的是合成的,会有一个mayBy()方法,它将反过来从这些对象中的每一项中提取指定的属性并返回一个新数组。

  1. var hawaii = Ember.Object.create({
  2. capital: "Honolulu"
  3. });
  4.  
  5. var california = Ember.Object.create({
  6. capital: "Sacramento"
  7. });
  8.  
  9. var states = [hawaii, california];
  10.  
  11. states.mapBy('capital');
  12. //=> ["Honolulu", "Sacramento"]

5. Filtering

另一个常见的任务是以枚举作为输入执行一个枚举,和基于一些条件过滤后返回一个数组。

对于任意的过滤,用过滤器方法。如果包含在最后的数组中,该过滤器的方法期望回调函数返回true,否则返回false或者undefined

  1. var arr = [1,2,3,4,5];
  2.  
  3. arr.filter(function(item, index, self) {
  4. if (item < 4) { return true; }
  5. })
  6.  
  7. // returns [1,2,3]

当使用一个集合对象时,通常需要根据某些属性的值来筛选一组对象。filterBy方法提供了一个快捷方式。

  1. Todo = Ember.Object.extend({
  2. title: null,
  3. isDone: false
  4. });
  5.  
  6. todos = [
  7. Todo.create({ title: 'Write code', isDone: true }),
  8. Todo.create({ title: 'Go to sleep' })
  9. ];
  10.  
  11. todos.filterBy('isDone', true);
  12.  
  13. // returns an Array containing only items with `isDone == true`

如果你只需要返回第一个匹配的值,而不是包含所有匹配的值的数组,你可以使用findfindBy,它们只返回一条数据。

6. Aggregate Information(All or Any)汇总信息

如果你想找到可枚举中的每一条数据都满足一些条件,你可以使用every方法。

  1. Person = Ember.Object.extend({
  2. name: null,
  3. isHappy: false
  4. });
  5.  
  6. var people = [
  7. Person.create({ name: 'Yehuda', isHappy: true }),
  8. Person.create({ name: 'Majd', isHappy: false })
  9. ];
  10.  
  11. people.every(function(person, index, self) {
  12. if(person.get('isHappy')) { return true; }
  13. });
  14.  
  15. // returns false

如果你想找到可枚举中的至少一条数据都满足一些条件,你可以使用some方法。

  1. people.some(function(person, index, self) {
  2. if(person.get('isHappy')) { return true; }
  3. });
  4.  
  5. // returns true

就像过滤方法一样,every和some有类似的方法isEveryisAny方法。

  1. people.isEvery('isHappy', true) // false
  2. people.isAny('isHappy', true) // true

2.8 The Object Model -- Enumerables的更多相关文章

  1. Selenium的PO模式(Page Object Model)[python版]

     Page Object Model 简称POM  普通的测试用例代码: .... #测试用例 def test_login_mail(self): driver = self.driver driv ...

  2. 在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况

    自从人类学会了使用火,烤制的方式替代了人类的消化系统部分功能,从此人类的消化系统更加简单,加速了人脑的进化:自从SharePoint 2010开始有了Client Side Object Model ...

  3. Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)

            研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...

  4. 解决在使用client object model的时候报“object does not belong to a list”错误

    在查看别人代码的时候,发现了个有意思的问题,使用client object model将一个文件check in 我使用的是如下语句获取file Microsoft.SharePoint.Client ...

  5. Page Object Model (Selenium, Python)

    时间 2015-06-15 00:11:56  Qxf2 blog 原文  http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...

  6. SharePoint Client Object Model API 介绍以及工作原理解析

    CSOM和ServerAPI 的对比 SharePoint从2010开始引入了Client Object Model的API(后文中用CSOM来代替),从名字来看,我们可以简单的看出,该API是面向客 ...

  7. BOM (Browser Object Model) 浏览器对象模型

    l对象的角色,因此所有在全局作用域中声明的变量/函数都会变成window对象的属性和方法; // PS:尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的对象是否存 ...

  8. 文本对象模型(Document Object Model)

    本文内容: 1. 概述 2. DOM中的节点类型 3. DOM节点的选取 4. 存取元素属性 5.DOM元素的增删 6.小结 ★ 概述 文本对象模型(DOM)是一个能够让程序和脚本动态访问和更新文档内 ...

  9. 浏览器对象模型(BOM,Browser Object Model)

    本文内容     1.概述     2.windows与document     3.对话框     4.定时调用     5.URL解析与访问历史     6.浏览器和屏幕信息 ★概述     &q ...

随机推荐

  1. MongoDB C#驱动中Query几个方法

    Query.All("name", "a", "b");//通过多个元素来匹配数组 Query.And(Query.EQ("nam ...

  2. elastic-job(lite)使用的一些注意事项

    前段时间项目开发中用到了当当开源的elastic-job,使用过程遇到一些问题,虽然不见得会影响写代码,但作为一个致力于搬好每一块砖的码农,当碰到问题时,我们不应该逃避,应该本着有困难也要上,没有困难 ...

  3. 使用 XPath

    XPath 简介: (1) 前面我们爬取一个网页,都是使用正则表达式来提取想要的信息,但是这种方式比较复杂,一旦有一个地方写错,就匹配不出来了,因此我们可以使用 XPath 来进行提取(2) XPat ...

  4. 改变PS1的颜色

    我们能够通过配置PS1变量使提示符成为彩色.在PS1中配置字符序列颜色的格式为:       \[\e[F;Bm\]       基本上是夹在 "\e["(转义开方括号)和 &qu ...

  5. N76E003学习之路(二)

    最近一直在想N76E003和STM8M003的对比情况,在网上找了不少资料,看了不少文档,具体总结如下: STM8S003F3P6:一共20个脚,最多支持16个GPIO,支持16个外部中断:2个16位 ...

  6. Delphi 有关的网址

    1.  博客园 (张志峰)    http://www.cnblogs.com/zhangzhifeng/ 2. CSDN  Delphi论坛        https://bbs.csdn.net/ ...

  7. 学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rails等)

    这篇文章主要介绍了学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rails等),需要的朋友可以参考下     Ruby 这个就不用多说了 RVM 用于帮你安装Rub ...

  8. JS-随机div颜色

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. LeetCode——Implement Queue using Stacks

    Description: Implement the following operations of a queue using stacks. push(x) -- Push element x t ...

  10. Windows Phone 上拉刷新、下拉刷新

    ScrollViewer scrollViewer = new ScrollViewer(); // 构造函数 public MainPage() { InitializeComponent(); ; ...