本篇内容较多,拆分为两篇!html
Ember官网用了大篇幅来介绍model,相比以前的controller简直就是天壤之别啊!node
从本篇开始学习Ember的模型,这一章也是Ember基础部分的最后一章内容,很是的重要(无论你信不信反正我是信了)。git
在开始学习model以前先作好准备工做:github
从新建立一个Ember项目,仍旧使用的是Ember CLI命令建立。web
ember new chapter6_models数据库
cd chapter6_modelsjson
ember serverubuntu
在浏览器执行项目,看到以下信息说明项目搭建成功。vim
Welcome to Ember后端
本章演示所用到的代码均可以从https://github.com/ubuntuvim/my_emberjs_code/tree/master/chapter6_models获取。
在介绍model以前先在项目中引入firebase。相关的配置教材请移步这里(若是没法加载页面请先在https://www.firebase.com/注册用户)。firebase的官网提供了专门用于Ember的版本,还提供了很是简单的例子。从安装到整合都给出了很是详细代码教程。
下面是个人整合步骤(命令都是在项目目录下执行的):
1,安装
ember install emberfire
安装完成以后会自动建立adapter(app/adapters/application.js),对于这个文件不须要作任何修改,官网提供的代码也许跟你的项目的代码不一样,应该是官网的版本是旧版的。
2,配置config/environment.js
修改第八行firebase: 'https://YOUR-FIREBASE-NAME.firebaseio.com/'。这个地址是你注册用户时候获得的。你能够从这里查看你的地址。好比下图所示位置
3,再在config/enviroment.js的APP:{}(大概第20行)后面新增以下代码
APP: { // Here you can pass flags/options to your application instance // when it is created }, contentSecurityPolicy: { 'default-src': "'none'", 'script-src': "'self' 'unsafe-inline' 'unsafe-eval' *", 'font-src': "'self' *", 'connect-src': "'self' *", 'img-src': "'self' *", 'style-src': "'self' 'unsafe-inline' *", 'frame-src': "*" }
而后再注释掉第7行原有属性(安装firebase自动生成的,可是配置不够完整):contentSecurityPolicy。
或者你能够按照个人配置文件设置:
/* jshint node: true */ module.exports = function(environment) { var ENV = { modulePrefix: 'chapter6-models', environment: environment, // contentSecurityPolicy: { 'connect-src': "'self' https://auth.firebase.com wss://*.firebaseio.com" }, firebase: '你的firebase链接', baseURL: '/', locationType: 'auto', EmberENV: { FEATURES: { // Here you can enable experimental features on an ember canary build // e.g. 'with-controller': true } }, APP: { // Here you can pass flags/options to your application instance // when it is created }, contentSecurityPolicy: { 'default-src': "'none'", 'script-src': "'self' 'unsafe-inline' 'unsafe-eval' *", 'font-src': "'self' *", 'connect-src': "'self' *", 'img-src': "'self' *", 'style-src': "'self' 'unsafe-inline' *", 'frame-src': "*" } }; // 其余代码省略…… return ENV; };
若是不作这个配置启动项目以后浏览器会提示一堆的错误。主要是一些访问权限问题。配置完以后须要重启项目才能生效!
model是一个用于向用户呈现底层数据的对象。不一样的应用有不一样的model,这取决于解决的问题须要什么样的model就定义什么样的model。
model一般是持久化的。这也就意味着用户关闭了浏览器窗口model数据不该该丢失。为了确保model数据不丢失,你须要存储model数据到你所指定的服务器或者是本地数据文件中。
一种很是常见的状况是,model数据会以JSON的格式经过HTTP发送到服务器并保存在服务中。Ember还未开发者提供了一种更加简便的方式:使用IndexedDB(使用在浏览器中的数据库)。这种方式是把model数据保存到本地。或者使用Ember Data,又或者使用firebase,把数据直接保存到远程服务器上,后续的文章我将引入firebase,把数据保存到远程服务器上。
Ember使用适配器模式链接数据库,能够适配不一样类型的后端数据库而不须要修改任何的网络代码。你能够从emberobserver上看到几乎全部Ember支持的数据库。
若是你想把你的Ember应用与你的远程服务器整合,几遍远程服务器API返回的数据不是规范的JSON数据也没关系,Ember Data能够配置任何服务器返回的数据。
Ember Data还支持流媒体服务器,好比WebSocket。你能够打开一个socket链接远程服务器,获取最新的数据或者把变化的数据推送到远程服务器保存。
Ember Data为你提供了更加简便的方式操做数据,统一管理数据的加载,下降程序复杂度。
对于model与Ember Data的介绍就到此为止吧,官网用了大量篇幅介绍Model,在此我就不一一写出来了!太长了,写出来也没人看的!!!若是有兴趣本身看吧!点击查看详细信息。
下面先看一个简单的例子,由这个例子延伸出有关于model的核心概念。这些代码是旧版写法,仅仅是为了说明问题,本文也不会真正执行。
// app/components/list-of-drafts.js export default Ember.Component.extend({ willRender() { // ECMAScript 6语法 $.getJSON('/drafts').then(data => { this.set('drafts', data); }); } });
定义了一个组件类。并在组件类中获取json格式数据。
下面是组件对应的模板文件。
<!-- app/templates/components/list-of-drafts.hbs --> <ul> {{#each drafts key="id" as |draft|}} <li>{{draft.title}}</li> {{/each}} </ul>
再定义另一个组件类和模板
// app/components/list-button.js export default Ember.Component.extend({ willRender() { // ECMAScript 6语法 $.getJSON('/drafts').then(data => { this.set('drafts', data); }); } });
<!-- app/templates/components/ list-button.hbs --> {{#link-to ‘drafts’ tagName=’button’}} Drafts ({{drafts.length}}) {{/link-to}}
组件list-of-drafts类和组件list-button类是同样的,可是他们的对应的模板却不同。可是都是从远程服务器获取一样的数据。若是没有Store(model核心内容之一)那么每次这两个模板渲染都会是组件类调用一次远程数据。而且返回的数据是同样的。这无形中增长了没必要要的请求,暂用了没必要要的宽带,用户体验也很差。可是有了Store就不同了,你能够把Store理解为仓库,每次执行组件类时先到Store中获取数据,若是没有再去远程获取。当在其中一个组件中改变某些数据,数据的更改也能理解反应到另外一个获取此数据的组件上(与计*算属性自动更新同样),而这个组件不须要再去服务请求才能获取最新更改过的数据。
下面的内容将为你一一介绍Ember Data最核心的几个东西:models、records、adapters、store。