深入理解Ember-Data特性(上)
写在前面
最近比较忙,换了新工作还要学习很多全新的技术栈,并给自己找了很多借口来不去坚持写博客。常常具有讽刺意味的是,更多剩下的时间并没有利用而更多的是白白浪费,也许这就是青春吧,挥霍吧,这不是我想要的,既然这样,我还要继续写下去,坚持把博客做好,争取进前100博客,在此谨记。
2015年5月7日深夜,于电脑旁。
文章索引
综述
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"(无逻辑模版)的思路,在加载时被预编译,而不是到了客户端执行到代码时再去编译, 这样可以保证模板加载和运行的速度。

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特性(上)的更多相关文章
- JAVA理解逻辑程序的书上全部重要的习题
今天随便翻翻看以前学过JAVA理解逻辑程序的书上全部练习,为了一些刚学的学弟学妹,所以呢就把这些作为共享了. 希望对初学的学弟学妹有所帮助! 例子:升级“我行我素购物管理系统”,实现购物结算功能 代码 ...
- 线代笔记 #01# 几何水平上的理解 VS. 数值水平上的理解
源: 线性代数的本质 内容来自字幕. Let me quote without further comment from Dieudonné's "Foundations of Modern ...
- 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)
转载:https://www.cnblogs.com/flying-tiger/p/9567213.html#4121483#undefined PostgreSQL为开发者提供了一组丰富的工具来管理 ...
- 浅析Postgres中的并发控制(Concurrency Control)与事务特性(上)(转)
这篇博客将MVCC讲的很透彻,以前自己懂了,很难给别人讲出来,但是这篇文章给的例子就让人很容易的复述出来,因此想记录一下,转载给更多的人 转自:https://www.cnblogs.com/flyi ...
- Spring Boot2 系列教程(二十三)理解 Spring Data Jpa
有很多读者留言希望松哥能好好聊聊 Spring Data Jpa! 其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring ...
- 难以理解的AQS(上)
在一篇博客中,我们看了下CopyOnWriteArrayList的源码,不是很难,里面用到了一个可重入的排他锁: ReentrantLock,这东西看上去和Synchronized差不多,但是和Syn ...
- 理解JAVA虚拟机(上)
2016-04-16 23:10:50 在这里,我们进一步认识JAVA及JAVA虚拟机,包括它的体系结构和垃圾回收机制等,并通过虚拟机监控工具进行简单的性能调优. 一. JVM相关概念 ...
- 深入理解Core Data
留给我这忘事精看 Core Data 是什么? 大概八年前,2005年的四月份,Apple 公布了 OS X 10.4,正是在这个版本号中 Core Data 框架公布了.那个时候 YouTube 也 ...
- d3可视化实战01:理解SVG元素特性
一. SVG简介 ————————————————————————————————————————————————————————————————— SVG是一种和图像分辨率无关的矢量图形格式,它使用 ...
- 深入理解 Python 异步编程(上)
http://python.jobbole.com/88291/ 前言 很多朋友对异步编程都处于"听说很强大"的认知状态.鲜有在生产项目中使用它.而使用它的同学,则大多数都停留在知 ...
随机推荐
- 使用kindeditor文本编辑器
aspx中代码: <%@ Page Language="C#" ValidateRequest="false" AutoEventWireup=" ...
- iOS.Performance-trick-presentViewController-is-so-slow-in-didSelectRowAtIndexPath
presentViewController is so slow in "tableView:didSelectRowAtIndexPath:" Use Case: 在UITabl ...
- 20145229&20145316 《信息安全系统设计基础》 实验二 固件设计
实验封面 实验步骤 1.配置环境 开发环境的配置同实验一 2.拷贝文件 将实验代码拷贝到共享文件夹中 3.在虚拟机中编译代码 4.下载调试 在超级终端中运行可执行文件pthread,可得实验结果如图 ...
- exec、source以及bash的区别(zz)
在bash shell中,source.exec以及sh都可以用来执行shell script,但是它们的差别在哪里呢? sh:父进程会fork一个子进程,shell script在子进程中执行 so ...
- PhoneGap--001 入门 安装
PhoneGap 百度百科 PhoneGap 中文网 3.0 安装使用 今天也配置好phonegap3.0 android开发环境了,操作系统是win7,就楼主文章做些补充. 我是按phonegap官 ...
- 陨石坑之webapi使用filter
首先为什么说这是一个坑,是因为我们在webapi中使用filter的时候也许会先百度一下,好吧,挖坑的来了,我看了好几篇文章写的是使用System.Web.Mvc.Filters.ActionFilt ...
- adb devices 端口占用
一. 1.通过cmd命令,输入adb devices查看连接设备时,报错 2 .通过adb nodaemon server 查看adb server绑定的端口.提示“通过每个套接字地址只能使用一次” ...
- css3中的颜色
1颜色.color:rgba(R,G,B,A) R,G,B是分别代笔红,绿,蓝值是在0到255之间的数也可以是0.0% - 100.0%,A代表的是透明度0到1之间. 2.渐变.background- ...
- CAD二次开发 - 可缩放块(四)
1.说明 可进行缩放性注释的对象有:文字.标注.图案填充.公差.多重引线.块及属性. 2.为图形添加.删除注释比例步骤 1)使用AnnotationScale类(在DatabaseServices命名 ...
- 写了一个基于React+Redux的仿Github进度条
曾经实现过Angular版,这次感觉用了高大上的React却写了更多的代码,需要的配置也更多了,有利有弊吧. 但这个“导航条问题”很有意思,涉及到在Redux中写timer,其实我很困惑,到底如何完美 ...