写在前面

最近比较忙,换了新工作还要学习很多全新的技术栈,并给自己找了很多借口来不去坚持写博客。常常具有讽刺意味的是,更多剩下的时间并没有利用而更多的是白白浪费,也许这就是青春吧,挥霍吧,这不是我想要的,既然这样,我还要继续写下去,坚持把博客做好,争取进前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. java: R文件重复

    导入eclipse工程到intellij里面, 然后出现各种错误, xxx.R文件重复, 各种资源id在R文件中找不到, 后来发现是intellij默认将整个项目以及gen文件夹作为源代码目录了, 在 ...

  2. 20145316&20145229实验四:驱动程序设计

    20145316&20145229实验四:驱动程序设计 结对伙伴:20145316 许心远 博客链接:http://www.cnblogs.com/xxy745214935/p/6130871 ...

  3. IE9下WebUploader上传图片跨域问题

    作为前端,这一次踩到后台xml配置的坑. IE9下上传图片通过flash插件,一直发送http://192.168.0.8:8888/crossdomain.xml请求,状态码为404,原因是上传图片 ...

  4. Oracle优化的方法

    想做到数据库优化的高手,不是花几周,几个月就能达到的,这并不是因为数据库优化有多高深,而是因为要做好优化一方面需要有非常好的技术功底,对操作系统.存储硬件网络.数据库原理等方面有比较扎实的基础知识,另 ...

  5. Android视图状态及重绘流程分析,带你一步步深入了解View(三)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17045157 在前面一篇文章中,我带着大家一起从源码的层面上分析了视图的绘制流程, ...

  6. HTML页面跳转的5种方法

    下面列了五个例子来详细说明,这几个例子的主要功能是:在5秒后,自动跳转到同目录下的hello.html(根据自己需要自行修改)文件.1) html的实现 <head> <!-- 以下 ...

  7. C++中有符号/无符号数比较

    原创文章,欢迎阅读,禁止转载. 在我的程序中有如下代码编译被警告了 if(list.size()>msize){...} warning C4018: '<' : signed/unsig ...

  8. Linux图片批处理

    通过imagemagick的convert命令来处理. 将多个图片横向拼接(宽图): convert +append 1.jpg 2.jpg all.jpg #人为指定顺序 convert +appe ...

  9. 利用FPGA加速实现高性能计算

    原文链接 原因:处理器本身无法满足高性能计算(HPC)应用软件的性能需求,导致需求和性能 之间出现了缺口. 最初解决办法:使用协处理器来提升处理器的性能. 协处理器(基于硬件的设计)具有三种能力: 1 ...

  10. java jdk动态代理

    在面试的时候面试题里有一道jdk的动态代理是原理,并给一个事例直接写代码出来,现在再整理一下 jdk动态代理主要是想动态在代码中增加一些功能,不影响现有代码,实现动态代理需要做如下几个操作 1.首先必 ...