写在前面

最近比较忙,换了新工作还要学习很多全新的技术栈,并给自己找了很多借口来不去坚持写博客。常常具有讽刺意味的是,更多剩下的时间并没有利用而更多的是白白浪费,也许这就是青春吧,挥霍吧,这不是我想要的,既然这样,我还要继续写下去,坚持把博客做好,争取进前100博客,在此谨记。

2015年5月7日深夜,于电脑旁。

文章索引

JS前端框架之Ember.js系列

综述

  Ember-Data对于Web应用程序来说是一个ORM Framework。Ember-Data直接作用于服务端数据,允许您更改格式化服务端数据,最小化客户端展现的数据。您可以通过自定义adatpters和serializer来处理服务端的数据。

  Ember.js核心生态系统/架构图

  Runtime负责依据Model中的status状态更新View, 以建立一个由Model直接绑定View的一种方式。类似于Backbone.js的Collection,Ember.js中是用App.Store作为数据仓库来函缓存以及加载数据。

Metamorph.js

  即将用HTMLBar代替,Ember团队成员认为此模块是过于“笨重的脚本标签,现阶段我们使用这些标签追踪Dom中反馈的值,HTMLBar相当于HTML5和Handlebars组成的语法组件。

HTMLBar:http://oscarlodriguez.nl/Labs/htmlbars/#/

Handlebars.js

  Handlebars 是 JavaScript 一个语义模板库,通过对view和data的分离来快速构建Web模板。它采用"Logic-less template"(无逻辑模版)的思路,在加载时被预编译,而不是到了客户端执行到代码时再去编译, 这样可以保证模板加载和运行的速度。

  官网地址:http://handlebarsjs.com/

RSVP.js

  RSVP.js提供一个简单的工具来管理异步代码,简单来说它是实现了Promises/A+的一个小型框架。

ES6也引入了Promises,当你发起一个异步请求,并绑定了.when(), .done()等事件处理程序时,其实就是在应用promises模式。

  官网地址:https://github.com/tildeio/rsvp.js

Backburner.js

  一个重写Ember.js Run Loop的一般框架。

  作者加入了Ember.js团队:

  Backburner.js and the run loop.  Erik is joining us from San Francisco and I'm very excited to hear more.

  Github地址:https://github.com/ebryn/backburner.js

一、Ember-Data数据缓存

Ember-Data Model object模型对象对于Ember-Data作为一个服务来定义Model中含有的属性以及属性的类型。

定义Ember-Data模型

  MainMenu类扩展了DS.Model模型,定义了成员并指定了成员的类型和所属关系,模型中并未定义id属性,id属性是Ember-Data中隐式定义的方便数据仓库(Store)索引数据,如果重写此id属性则会有错误提示。从DS.Model中扩展出自己的Model好处是,可以继承一些列的绑定、监测函数(observers)、和计算属性等API,后续章节会详细分析这些属性。

Ember-Data是一种同一性数据映射

  一个普通的基于JavaScript的Web应用通过Json或者REST接口获得数据,并将数据保存在DOM树中,虽然这样能快速的更新View,但是开发人员需要确保旧数据将被从DOM树中移除,以保证Web程序性能。

  Ember-Data通过建立数据仓库来解决这个问题,并将数据缓存起来,然后通过唯一标识“id”来获取和更新数据,Ember-Data确保数据的同一性。

  下图显示Ember-Data管理它的数据以及同一性映射是如何工作的:

  第一次请求id为ABC的数据时,Ember-Data仓库中并没有数据,Ember-Data返回一个带有id和Status标识的“空数据”,同时向服务器发起请求。当收取到服务器返回值时,Ember-Data先将数据缓存下来,然后将变更的结果通知View(或者可以说View自动监听了Model的变化,稍后会做模型绑定分析)。

  第二次发起同样的请求时,Ember-Data发现其仓库内含有这样的数据,则直接返回其数值,而不再向服务器发起请求。

模型之间的关联关系

  由于模型之间的关系通常是散乱的、纠结的、关联的、非标准的等,Ember-Data通过提供功能和集成点来确保你能将这些关联的结构更好的组织起来。

  Ember-Data通过唯一标识id来确保组织的关系,下图来显示Ember-Data是如何通过Id来管理组织之间的关系的:

  默认情况下,RESTAdapter期望你的Key是能是camelized风格,首字母要小写,id的值要大写,并且如果返回的数据类型是数组或列表,则应该加后缀s。

你还可能看到“children”中并没有真正的数据,而仅仅只是含有指示到子类数据的id,Ember-Data通过id来查找子元素的值。

  Question: 什么子类的parent要绑定到父类?

  答:仅仅是数据结构上的定义。

模型的之中的状态和事件

  正因为大多数Ember-Data在程序中的行为是异步的,Ember-Data的模型内置了状态管理器,来维护数据状态,当数据发生改变时。Ember-Data在内部使用这些状态,来向Web程序提供数据。例如,当你想在界面上使用加载滚动条时,这些方法/属性将变的非常有用。

  而且,通过扩展DS.Model,Ember内置了转换函数能使开发者能在Controller或者View中调用这些功能。

  Ember-Data 的状态:

  注意:这些属性还可以组合使用,例如当isDirty和isDeleted都为true时表示:本地数据已删除,但还为收到服务端传来的删除确认信息。

  Ember-Data 事件列表:

  你可以通过 Model.on(‘didLoad’, function() { console.log(“Loaded!”)});来订阅事件通知,相当于在didLoad上注册一个事件以便监听Model发生的变化。

  下图是一个部分的状态流程图:

  当请求数据时,状态为isLoading,当数据返回到数据仓库中,状态为isLoaded,如果本地对数据做修改则状态变更为isDirty状态,当保存数据时,状态为isSaving, 服务端返回OK(例如http 200),状态由isSaving变更为isLoaded。或者isError。

  以上仅仅是常用的API,更多详情请参考:http://emberjs.com/api/data/classes/DS.Store.html

未完待续,请参考《深入理解Ember-Data特性(下)

深入理解Ember-Data特性(上)的更多相关文章

  1. JAVA理解逻辑程序的书上全部重要的习题

    今天随便翻翻看以前学过JAVA理解逻辑程序的书上全部练习,为了一些刚学的学弟学妹,所以呢就把这些作为共享了. 希望对初学的学弟学妹有所帮助! 例子:升级“我行我素购物管理系统”,实现购物结算功能 代码 ...

  2. 线代笔记 #01# 几何水平上的理解 VS. 数值水平上的理解

    源: 线性代数的本质 内容来自字幕. Let me quote without further comment from Dieudonné's "Foundations of Modern ...

  3. 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)

    转载:https://www.cnblogs.com/flying-tiger/p/9567213.html#4121483#undefined PostgreSQL为开发者提供了一组丰富的工具来管理 ...

  4. 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)(转)

    这篇博客将MVCC讲的很透彻,以前自己懂了,很难给别人讲出来,但是这篇文章给的例子就让人很容易的复述出来,因此想记录一下,转载给更多的人 转自:https://www.cnblogs.com/flyi ...

  5. Spring Boot2 系列教程(二十三)理解 Spring Data Jpa

    有很多读者留言希望松哥能好好聊聊 Spring Data Jpa! 其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring ...

  6. 难以理解的AQS(上)

    在一篇博客中,我们看了下CopyOnWriteArrayList的源码,不是很难,里面用到了一个可重入的排他锁: ReentrantLock,这东西看上去和Synchronized差不多,但是和Syn ...

  7. 理解JAVA虚拟机(上)

    2016-04-16 23:10:50 在这里,我们进一步认识JAVA及JAVA虚拟机,包括它的体系结构和垃圾回收机制等,并通过虚拟机监控工具进行简单的性能调优. 一. JVM相关概念        ...

  8. 深入理解Core Data

    留给我这忘事精看 Core Data 是什么? 大概八年前,2005年的四月份,Apple 公布了 OS X 10.4,正是在这个版本号中 Core Data 框架公布了.那个时候 YouTube 也 ...

  9. d3可视化实战01:理解SVG元素特性

    一. SVG简介 ————————————————————————————————————————————————————————————————— SVG是一种和图像分辨率无关的矢量图形格式,它使用 ...

  10. 深入理解 Python 异步编程(上)

    http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...

随机推荐

  1. JS验证字符长度

    function getStrLength(str) { var cArr = str.match(/[^\x00-\xff]/ig); return str.length + (cArr == nu ...

  2. 图的割点 | | jzoj【P1230】 | | gdoi | |备用交换机

    写在前面:我真的不知道图的割点是什么.... 看见ftp图论专题里面有个dfnlow的一个文档,于是怀着好奇的心情打开了这个罪恶的word文档,,然后就开始漫长的P1230的征讨战.... 图的割点是 ...

  3. ubuntu下安装wordpress

    网上大多都是说放在var/www下面 实际上新版的ubuntu默认放在 var/www/html 下面 当然这个配置是可以修改的

  4. NashZhou的自我介绍

    行业: 电子商务服务业,目前主要是淘宝开放平台,ISV 关键词: 电商,淘宝直通车,关键词广告,自动优化 当前目标: 广告算法 广告主自动优化 希望能在这里结识有共同爱好踏实上进的园友,共同学习,共同 ...

  5. [erlang]supervisor(监控树)的重启策略

    1. init函数 init() -> {ok, {SupFlags, [ChildSpec,...]}} | ignore. [ChildSpec,...] 是在init之后默认要启动的子进程 ...

  6. cassandra-replication_factor 和 consistency level

    参考 replication_factor 决定了数据会被写到多少个节点.为2表示要写到两个节点. consistency level决定客户端要等待多少个节点被写成功.为1表示只要第一个节点被写成功 ...

  7. js之数据类型

    1.数组类型 var Array=new Array(); 长度可变 var Array=new Array(n); 长度为n的数组 var Array=new Array("A" ...

  8. OD使用教程12

    载入程序输入关键字: 双击进入程序 仔细看发现并没有跳转直接跳到这个mov,往上看发现retn上面有一个push,在这种编写手法当中这种组合相当于一个jmp, 跳到离它最近的一个值(在这就是004A5 ...

  9. jquery选择器使用说明

    在jquery中选择器是一个非常重要的东西,几乎做什么都离不开它,下面我总结了jquery几种选择器的用法.以方便后面直接可以用到!! 层次选择器: 1.find()://找到该元素的子元素以及孙子元 ...

  10. Codeigniter 在Active Record中限制批量更新数目

    今天手头电商项目有个需求是:将订单中的优惠券自动发放给买家,所以要只更新优惠券表中的某几行数据,查了手册和网络都没有解决办法. 一开始用循环和遍历来做都是错的,因为update语句一下就更新掉所有符合 ...