Ember JS:自定义适配器以包含多个参数

时间:2016-06-22 23:31:14

标签: javascript ember.js ember-data

我目前有一个包含2个对象的数据库:

  1. 作用
  2. 权限
  3. 一个角色可以拥有多个权限。我目前将我的角色适配器设置为:

    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);
          });
        });
      },
    });
    

1 个答案:

答案 0 :(得分:1)

我在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调用。

根据传入的url参数更改它以修改hash应该不是问题。

我的ember版本是2.3.2,但是我使用的是最新的稳定版(2.5.2版)的ember-data,如果你担心我找到的那篇博文的年代,这仍然很有效。