×

EmberJS 教程

EmberJS 概述EmberJS 环境配置EmberJS 应用EmberJS 对象模型EmberJS 模板EmberJS 路由器EmberJS 组件EmberJS 模型EmberJS 视图EmberJS 控制器EmberJS 测试EmberJS 指定查询参数

Ember 对象模型

Ember 类的定义 初始化 继承Ember 类的扩展Ember 计算属性Ember 观察者Ember 数据绑定Ember 枚举Ember 第一章对象模型小结

Ember handlebars模板

Ember handlebars基础Ember handlebars条件表达式Ember handlebars遍历标签Ember handlebars显示对象键Ember handlebars属性绑定Ember {{link-to}} 助手Ember 路由 模板执行渲染顺序Ember {{action}} 助手Ember 表单元素Ember 调试助手Ember 工具类的助手Ember 第二章模板小结

Ember 路由

Ember 路由定义Ember 指定与路由关联的模型Ember 模板渲染Ember 路由重定向Ember 路由终止挑战和激活Ember loading error子路由Ember 查询参数Ember 异步路由

Ember 组件

Ember 组件定义Ember 属性传递Ember 包裹内容自定义包裹组件的HTML标签Ember 处理事件Ember action触发变化

Ember 控制器

Ember 控制器Ember 管理控制器的依赖关系

Ember 模型

Ember model简介Ember 定义模型Ember 记录查询Ember 新建、更新、删除记录Ember 设置记录到StoreEmber model的关联关系处理Ember 元数据Ember 自定义适配器Ember 自定义序列号器

Ember 测试

Ember 测试简介Ember 验收测试Ember 单元测试

Ember 自定义适配器


在 Ember 应用中适配器决定了数据保存到后台的方式,比如URL格式和请求头部。Ember Data默认的适配器是内置的REST API回调

实际使用中经常会扩展默认的适配器。Ember的立场是应该通过扩展适配器来添加不同的功能,而非添加标识。这样可以使得代码更加容易测试、更加容易理解,同时也降低了可能需要扩展的适配器的代码。

如果你的后端使用的是Ember约定的规则那么可用使用适配器adapters/application.js。适配器application优先级比默认的适配器高,但是比指定的模型适配器优先级低。模型适配器定义规则是:adapter-modelName.js。比如下面的代码定义了一个模型适配器adapter-post

//  app/adapters/adapter-post.js

import Ember from 'ember';
export default DS.JSONAPIAdapter.extend({
    namespace: 'api/v1'
});

此时适配器的优先级次序为:JSONAPIAdapter > application> 默认内置适配器;

Ember内置的是配有如下几种:

  1. DS.Adapter 这个适配器是最基础的适配器,它不包含任何功能。如果需要创建一个与Ember适配器有根本性区别的适配器可以使从这个适配器入手。
  2. DS.JSONAPIAdapter 这个适配器是默认适配器,并且是遵循JSON API规范,用于与HTTP服务器之间通过XHR交互JSON数据。
  3. DS.RESTAdapter 这个适配器与第二个适配器功能一样,并且在Ember Data2.0之前是作为默认的适配器。

1,自定义JSONAPIAdapter适配器

JSONAPIAdapter适配器通常用于扩展非标准的后台接口。

1,URL规范

JSONAPIAdapter适配器非常智能,它能够自动确定URL链接是那个模型。比如,如果你需要通过id获取post

this.store.find('post', 1).then(function(post) {
    //  处理post
});

JSONAPIAdapter会自动发送get请求到/post/1

下表是Action、请求、URL三者的映射关系(由于本站markdown解析器不支持表格所以直接使用截图替代了)。

映射关系截图

比如在action中执行find()方法,会发送get请求,JSONAPIAdapter会自动解析成形如/posts/1的URL。

2,多元化定制

为了适配复数名字的模型属性名称,可以是使用Ember Inflector绑定别名。

let inflector = Ember.Inflector.inflector;
inflector.irregular('formula', 'formulae');
inflector.uncountable('advice');

这样绑定之后目的是告诉JSONAPIAdapter。你可以使用/formulae/1代替/formulas/1。但是目前我还没搞清楚这个设置是什么意思?又有什么用?如果读者知道请指教。

3,断点路径定制

使用属性namespace可以设置URL的前缀。

app/adapters/application.js
import Ember from 'ember';
export default DS.JSONAPIAdapter.extend({
  namespace: 'api/1'
});

请求person会自动转发到/api/1/people/1

4,自定义主机

默认情况下适配器会转到当前域名下。如果你想让URL转到新的域名可以使用属性host设置。

app/adapters/application.js
import Ember from 'ember';
export default DS.JSONAPIAdapter.extend({
  host: 'http://api.example.com'
});

注意:如果你的项目是使用自己的后台数据库这个设置特别重要!!!属性host所指的就是你服务器接口的地址。

请求person会自动转发到http://api.example.com/people/1

5,自定义路径

默认情况下Ember会尝试去根据复数的模型类名、中划线分隔的模型类名生成URL。如果需要改变这个默认的规则可以使用属性pathForType设置。

// app/adapters/application.js
import Ember from ‘ember’;
export default DS.JSONAPIAdapter.extend({
  pathForType: function(type) {
    return Ember.String.underscore(type);
  }
});

修改默认生成路径规则为下滑线分隔。比如请求person会转向/person/1。请求user-profile会转向/user_profile/1(默认情况转向user-profile/1)。

6,自定义请求头

有些请求需要设置请求头信息,比如提供APIkey。可以以键值对的方式设置头部信息,Ember Data会为每个请求都加上这个头信息设置。

app/adapters/application.js
import Ember from 'ember';
export default DS.JSONAPIAdapter.extend({
  headers: {
'API_KEY': 'secret key',
'ANOTHER_HEADER': 'some header value'
  }
});

更强大地方是你可以在header中使用计算属性,动态设置请求头信息。下面的代码是将一个session对象设置到适配器中。

app/adapters/application.js
import Ember from ‘ember’;
export default DS.JSONAPIAdapter.extend({
  session: Ember.inject.service(‘session’);
  headers: Ember.computed(‘session.authToken’, function() {
‘API_KEY’: this.get(‘session.authToken’),
‘ANOTHER_HEADER’: ‘some header value’  
  });
});

对于session应该非常不陌生,特别是在控制用户登录方面使用非常广泛,另外又一个非常好用的插件,专门用于控制用户登录的,这个插件是Ember Simple Auth

你还可以使用volatile()方法设置计算属性为非缓存属性,这样每次发送请求都会重新计算header里的值。

// app/adapters/application.js
import Ember from ‘ember’;
export default DS.JSONAPIAdapter.extend({
  //  ……
  }).volatile();
});

更多有关于适配器的信息浏览下面的网址:

对于适配器主要掌握JSONAPIAdapter足矣,如果你需要个性化定制URL或者请求的域名可以在适配中配置。不过大部分情况下都是使用默认设置。


分类导航

关注微信下载离线手册

bootwiki移动版 bootwiki
(群号:472910771)