一、概述

1. 在Ember Data中,和后台数据存储通信的逻辑存在于Adapter中。Ember Data的有一些内置的假设,一个 REST API 应该怎么看。如果你的后台约定和这些假设不同,Ember Data通过交换或扩展默认的适配器很容易改变它的功能。

2. 自定义适配器的一些原因包括在你的urls中使用underscores_case,使用一个介质而不是REST去和你的后台API甚至使用一个local backend

3.在Ember Data中扩展适配器是一个自然的过程。Ember认为,你应该扩展一个适配器来增加不同的功能而不是增加一个标记。这使得代码的可测试性更好,更加容易理解并且为那些想要子类化你的适配器的人减少了膨胀。

4. 如果你的后台有一些一致的规则,你可以定义一个adapter:application。这个adapter:application将比默认的适配器获得优先权,然而仍然会被特定的模型适配器取代。

app/adapters/application.js

export default DS.RESTAdapter.extend({
// Application specific overrides go here
});

5. 如果你有一个model对于和它的后台通信有例外的规则,你可以创建一个特定的模型适配器,通过运行命令ember generate adapter adapter-name。例如,运行ember generate adapter post将会创建下面的文件:

app/adapters/post.js

export default DS.RESTAdapter.extend({
namespace: 'api/v1'
});

6. 默认情况下,Ember Data伴随几个内置的适配器。为创建你自己的自定义适配器,使用这些适配器作为开始。

  • DS.Adapter:它是基本的没有任何功能的adapter。如果你想创建一个适配器,它通常是一个很好的起点,这是完全不同于其他的Ember adapters。
  • DS.RESTAdapter:它是最常见的扩展adapter。这个RESTAdapter允许你的store通过XHR传输的JSON和一个HTTP服务器通信。大多数Ember.js应用程序消耗一个JSON API,它应该使用这个REST适配器。
  • DS.ActiveModelAdapter:这是一个特定版本的RESTAdapter,这被设定为通过Rails-style REST APIS开箱即用。

二、Customizing the restadapter

这个 DS.RESTAdapter是最常见的扩展适配器。它有几个hooks,它们通常被用于扩展它和非标准的后台一起工作。

1. Endpoint Path Customization

namespace属性可以被用于使用一个指定的url命名空间给请求加前缀:

app/adapters/application.js

export default DS.RESTAdapter.extend({
namespace: 'api/1'
});

请求person现在将会导航到http://emberjs.com/api/1/people/1

2. Host Customization

默认的适配器将会导航到当前的域。如果你想指定一个新的域,你可以这样做,在适配器中设定host属性。

app/adapters/application.js

export default DS.RESTAdapter.extend({
host: 'https://api.example.com'
});

请求person现在讲导航到https://api.example.com/people/1

3. Path Customization

默认的,这个RESTAdapter将尝试复数化和驼峰化这个model name去生成path name。如果这个约定对你的后台来说不符合,你可以重写pathForType方法。

例如,如果你不希望复数化模型名字并且需要underscore_case(下划线命名)代替驼峰化命名,你可以像这样重写pathForType方法:

app/adapters/application.js

export default DS.RESTAdapter.extend({
pathForType: function(type) {
return Ember.String.underscore(type);
}
});

请求person现在将会导航到/person/1。请求userProfile想在将会导航到/user_profile/1

4. Authoring Adapters

这个默认的defaultSerializer属性可以被用于指定序列化器,它将被这个适配器使用。这个仅仅当一个指定的模型序列化器或者ApplicationSerializer 没有被定义时被使用。

在应用程序中,定义一个ApplicationSerializer通常很简单。然而,如果你是一个社区适配器的作者,在你的适配器用户不指定一个ApplicationSerializer的情况下,记得设置这个属性来保证Ember做正确的事是非常重要的。

app/adapters/my-custom-adapter.js

export default DS.RESTAdapter.extend({
defaultSerializer: '-default'
});

三、Community Adapters

如果没有内置的Ember Data适配器为你的后台工作,一定要去查看一些社区维护的Ember Data适配器。

下面是一些查找Ember Data适配器比较好的地方:

7.11 Models -- Customizing Adapters的更多相关文章

  1. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  2. Django详解之models操作

    D jango 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.p ...

  3. Ember.js学习教程 -- 目录

    写在前面的话: 公司的新项目需要用到Ember.js,版本为v1.13.0.由于网上关于Ember的资料非常少,所以只有硬着头皮看官网的Guides,为了加深印象和方便以后查阅就用自己拙劣的英语水平把 ...

  4. Spring框架文档与API(4.3.6版本)

    http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/ Table of Contents I ...

  5. url路由、模板语言、ajax、用django框架创建表

    1.后台管理的左侧菜单,默认只有第一个页签下面的选项是显示的,点了别的页签再显示别的页签下面的选项,问题是:点了任何菜单的选项后,左侧菜单又成了第一个页签的选项显示,别的页签隐藏,也就是左侧的菜单刷新 ...

  6. CodeIgniter目录结构

    1.1   application 是你自己的项目存放文件的目录(控制器.模型和视图等!) (1)分析application文件夹中的目录 (1.1)         cache文件是放缓存文件 (1 ...

  7. Django框架中的model(操作数据库)

    什么是ORM ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复 ...

  8. python django的ManyToMany简述

    Django的多对多关系 在Django的关系中,有一对一,一对多,多对多的关系 我们这里谈的是多对多的关系 ==我们首先来设计一个用于示例的表结构== # -*- coding: utf-8 -*- ...

  9. python Django知识点总结

    python Django知识点总结 一.Django创建项目: CMD 终端:Django_admin startproject sitename(文件名) 其他常用命令: 其他常用命令: 通过类创 ...

随机推荐

  1. eclipse中改变默认的workspace的方法

    1.File-->Switch Workspace-->Other 2.Window-->Preferences-->General-->Startup and Shui ...

  2. 用ChrootDirectory限制SFTP登录的用户只能访问指定目录且不能进行ssh登录

    创建不能ssh登录的用户sftpuser1,密码用于sftp登录: sudo adduser sftpuser1 --home /sftp/sftpuser1 --shell /bin/false s ...

  3. [Tjoi2016&Heoi2016]排序[01序列]

    4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 994  Solved: 546[Sub ...

  4. File类使用

    简介 File类的实例代表了一个文件或者一个目录,通过API可以获取这个对象的相关信息. File类代表的文件或者目录可以真实存在,也可以是不存在的,可以使用File.exists()来判断. 在Wi ...

  5. ios三张图片组合一张

    - (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2 { UIGraphicsBeginImageContext(imag ...

  6. Unity3D笔记十八 GL图像库

    1.绘制2D图像的时需要使用GL.LoadOrtho()方法来将图形映射到平面中. 2.所有绘制相关的内容都要写在OnPostRender()方法中. 3.有关GL图像库的脚本需要绑定到Hierarc ...

  7. Coding 代码管理快速入门(转)

    当项目创建好了之后,我们该如何上传代码到 coding 上呢? Coding 网站使用“ Git 仓库”(类似 github )来管理代码. 其操作原理在于:利用 git 服务,将本地的项目目录下的文 ...

  8. [转]-[携程]-A Hybrid Collaborative Filtering Model with Deep Structure for Recommender Systems

    原文链接:推荐系统中基于深度学习的混合协同过滤模型 近些年,深度学习在语音识别.图像处理.自然语言处理等领域都取得了很大的突破与成就.相对来说,深度学习在推荐系统领域的研究与应用还处于早期阶段. 携程 ...

  9. bin/hdfs dfs命令存在WARN util.NativeCodeLoader问题消除方法

    例如:[hadoop@db01 hadoop-2.5.0]$ bin/hdfs dfs -ls17/03/01 21:50:33 WARN util.NativeCodeLoader: Unable ...

  10. MySQL半同步复制(5.5之后引入)

    半同步复制架构在主库提交一个事务后,commit完成即反馈客户端,无需等待推送binlog完成,如图: 半同步复制在主库完成一个事务后,需等待事务信息写入binlog日志并且至少有一个从库写入rela ...