Ember JS:自定义适配器以包含多个参数
Ember JS: Customizing adapter to include multiple parameters
我目前有一个包含 2 个对象的数据库:
- 角色
- 权限
一个角色可以拥有多个权限。我目前的角色适配器设置为:
export default DS.RESTAdapter.extend(DataAdapterMixin, {
namespace: 'v1',
host: ENV.APP.API_HOST,
authorizer: 'authorizer:application',
pathForType: function(type) {
return 'staff/roles';
}
});
默认情况下,当权限添加到角色时,它会生成此请求:
要求:
PUT /v1/staff/roles/1
正文:
{
"name": "name_of_role"
"permissions": [
{
"id": "3",
"name": "name_of_permission"
},
...
]
}
我想自定义我的适配器以生成如下所示的请求:
要求:
PUT /v1/staff/roles/1/permissions/3
正文:
<None>
有人可以告诉我该怎么做吗?不幸的是,更新服务器 api 以适应 Ember JS 不是一个选项。
更新:
根据 Ryan 的回复,这里有一个(我称之为凌乱的)解决方法,对我有用。
愿意接受让这更优雅的建议:
export default DS.RESTAdapter.extend(DataAdapterMixin, {
namespace: 'v1',
host: ENV.APP.API_HOST,
authorizer: 'authorizer:application',
pathForType: function(type) {
return 'staff/roles';
},
updateRecord: function(embestore, type, snapshot) {
var roleID = snapshot.id;
var permissionID = snapshot.adapterOptions.permissionID;
var url = ENV.APP.API_HOST + "/v1/staff/roles/" + roleID + "/permissions/" + permissionID;
return new Ember.RSVP.Promise(function(resolve, reject){
Ember.$.ajax({
type: 'PUT',
url: url,
headers: {'Authorization': 'OAUTH_TOKEN'},
dataType: 'json',
}).then(function(data) {
Ember.run(null, resolve, data);
}, function(jqXHR) {
jqXHR.then = null; // tame jQuery's ill mannered promises
Ember.run(null, reject, jqXHR);
});
});
},
});
我在 Ember 文档中找不到它,但有一个 universal ajax method 附加到适配器,您可以覆盖它。
所以在我的适配器中,为了适应我们的身份验证方案,我这样做了:
export default DS.RESTAdapter.extend({
host: ENV.host,
ajax: function(url, method, hash){
if(hash){
if(hash.data !== undefined && hash.data !== null){
hash.data.sessionId = this.getSessionId();
}
}else {
hash = {
data: {}
};
hash.data.sessionId = this.getSessionId();
}
return this._super(url, method, hash);
},
getSessionId: function(){
return window.sessionStorage.getItem('sessionId') || {};
}
}
这会将 sessionId 附加到通过整个应用程序对服务器进行的每个 ajax 调用。
根据传入的 hash
参数更改它以修改您的 url
应该不是问题。
我的 ember 版本是 2.3.2,但我使用的是 ember-data 的最新稳定版 (2.5.2),如果您担心的话,它仍然可以正常工作关于那个博客的年龄 post 我找到了。
我目前有一个包含 2 个对象的数据库:
- 角色
- 权限
一个角色可以拥有多个权限。我目前的角色适配器设置为:
export default DS.RESTAdapter.extend(DataAdapterMixin, {
namespace: 'v1',
host: ENV.APP.API_HOST,
authorizer: 'authorizer:application',
pathForType: function(type) {
return 'staff/roles';
}
});
默认情况下,当权限添加到角色时,它会生成此请求:
要求:
PUT /v1/staff/roles/1
正文:
{
"name": "name_of_role"
"permissions": [
{
"id": "3",
"name": "name_of_permission"
},
...
]
}
我想自定义我的适配器以生成如下所示的请求:
要求:
PUT /v1/staff/roles/1/permissions/3
正文:
<None>
有人可以告诉我该怎么做吗?不幸的是,更新服务器 api 以适应 Ember JS 不是一个选项。
更新:
根据 Ryan 的回复,这里有一个(我称之为凌乱的)解决方法,对我有用。
愿意接受让这更优雅的建议:
export default DS.RESTAdapter.extend(DataAdapterMixin, {
namespace: 'v1',
host: ENV.APP.API_HOST,
authorizer: 'authorizer:application',
pathForType: function(type) {
return 'staff/roles';
},
updateRecord: function(embestore, type, snapshot) {
var roleID = snapshot.id;
var permissionID = snapshot.adapterOptions.permissionID;
var url = ENV.APP.API_HOST + "/v1/staff/roles/" + roleID + "/permissions/" + permissionID;
return new Ember.RSVP.Promise(function(resolve, reject){
Ember.$.ajax({
type: 'PUT',
url: url,
headers: {'Authorization': 'OAUTH_TOKEN'},
dataType: 'json',
}).then(function(data) {
Ember.run(null, resolve, data);
}, function(jqXHR) {
jqXHR.then = null; // tame jQuery's ill mannered promises
Ember.run(null, reject, jqXHR);
});
});
},
});
我在 Ember 文档中找不到它,但有一个 universal ajax method 附加到适配器,您可以覆盖它。
所以在我的适配器中,为了适应我们的身份验证方案,我这样做了:
export default DS.RESTAdapter.extend({
host: ENV.host,
ajax: function(url, method, hash){
if(hash){
if(hash.data !== undefined && hash.data !== null){
hash.data.sessionId = this.getSessionId();
}
}else {
hash = {
data: {}
};
hash.data.sessionId = this.getSessionId();
}
return this._super(url, method, hash);
},
getSessionId: function(){
return window.sessionStorage.getItem('sessionId') || {};
}
}
这会将 sessionId 附加到通过整个应用程序对服务器进行的每个 ajax 调用。
根据传入的 hash
参数更改它以修改您的 url
应该不是问题。
我的 ember 版本是 2.3.2,但我使用的是 ember-data 的最新稳定版 (2.5.2),如果您担心的话,它仍然可以正常工作关于那个博客的年龄 post 我找到了。