到目前为止 ,这个系列我们探讨了Bower, AngularJS, GruntJS, PhoneGap, 和MeteorJS JavaScript技术,今天,我决定学习一个叫Ember的框架。本文,我们来学习用Ember创建一个单页网摘网页。这个指南会写两篇文章,第一篇讲客户端和长期保存数据到HTML 5本地存储中,第二篇讲用RESTful后端部署到OpenShift. 接下来的几天会完成第二篇。
程序用例
本文,我们来开发一个网摘程序,允许用户发布和共享链接,你可访问在线应用。这个应用可以做以下事:
- 当用户打开应用'/' url,可以看到一个文章列表,以提交日期排序。
- 用户点击任意文章如#/storites/d6p88, 他可以看到文章由谁提交的,什么时候提交的和文章摘要。
- 最后,用户可以到页面#/story/new提交新内容,这会保存在用户浏览器本地缓存中。
什么是Ember?
Ember是一个客户端JavaScript MV* 框架,用来开发艰巨的Web程序,它有jQuery和Handlebars库依赖,如果你用过Backbone, 那你可以发现Ember如同固执的Backbone或者Backbone++. 如果你遵循它的命名规范,Ember可以为你做很多事,Ember.js严格遵循命名规范,假如我们应用中有一个url路径 /stories, 那我们会有以下:
- 一个stories模板
- 一个StoriesRoute
- 一个StoriesController
要更好的了解Ember命名规范,参考文档。
Ember核心概念
这部分我们关注EmberJS四个主要核心概念,今天的demo会用到。
- Model: 模型呈现了我们要展示给用户的程序域对象,以上我们讨论的程序用例中,一篇文章代表一个模型,文章随同它的属性如标题,url等组成了模型,模型可以重置或更新,靠jQuery从服务器加载JSON数据或者程序使用Ember数据. Ember数据是客户端ORM实施,使对底层长期存储执行CRUD操作更简单。Ember数据提供了一个仓库接口,可配置一系列提供的适配器。两个核心适配器是RESTAdapter和FixtureAdapter. 本文我们用LocalStorage适配器,用于长期保存数据到HTML 5 本地存储。详情请参考文档。
- Router和Route: 路由器用于指定程序路由,一个url对应一个路由。例如,用户打开'/#/story/new', 那newstroy模板就会被加载,这个newstory模板代表了一个HTML表格,用户可以通过创建Ember.Route子类自定义路由。以上示例中,假设用户打开'/#/story/new', 想在newstory加载默认模型,NewStoryRoute会给一个默认模型给newstory. 详情请参考文档。
- Controller: 控制器可做两件事:一是装饰路由返回的模板,二是舰艇用户执行动作。例如,当用户用相关数据提交文章后,NewStoryController会用Ember Data API将数据持久保存到底层存储中,详情请参考文档。
- Template: 模板代表程序的用户接口,每个程序都有一个默认模板,当程序启动时被加载。标头,页脚,导航和其他常用内容应该放置在这个模板里。Ember.js用Handlebars 模板库来增强程序用户接口。
Ember Chrome扩展
EmberJS也提供了一个chrome扩展,使程序易于调试,这个扩展在chrome web store有,更多了解请参考Ember团队的简短视频。
Github仓库
今天的demo放在github: day19-emberjs-demo.
第一步:下载starter kit
Ember提供了一个starter kit让我们快速入门。Starter kit包含需要的javascript文件(ember-*.js, jquery-*.js, handlerbars-*.js)和示例程序。下载并解压,最后按以下方式重命名为getbookmarks, getbookmarks是程序名字。
$ wget https://github.com/emberjs/starter-kit/archive/v1.1.2.zip $ unzip v1.1.2.zip $ mv starter-kit-1.1.2/ getbookmarks