7.11 Models -- Customizing Adapters
一、概述
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适配器比较好的地方: