使用Ember数据拦截REST调用

时间:2014-02-19 10:21:04

标签: ember.js ember-data

对于我正在使用的DELETE方法工作的特定REST服务器有两种。在没有查询参数的情况下调用时,删除操作会导致更新发生,其中底层资源的工作流状态为“标记为删除”。但是,如果立即删除 目标,则只需添加查询参数?immediate=true

我将以编程方式发送基于一些简单的客户端逻辑选择要发送哪些变种,但我不确定如何将我的查询参数添加到DELETE请求中。

在这两种情况下,我都假设调用DS.Model的.destroyRecord().deleteRecord()是合适的。我也想知道这是否需要创建自定义DS.Adapter。我很想避免这种情况,但如果我必须这样做,那么有什么好的例子吗?有没有办法继承所有适配器方法的实现,只覆盖需要更改的内容(文档表明DS.Adapter纯粹是抽象的)?

1 个答案:

答案 0 :(得分:1)

一种解决方案是覆盖RESTAdapter:

App.ProductAdapter = DS.RESTAdapter.extend({

   deleteRecord: function(store, type, record) {
     //do ajax stuff here

     //return a promise that resolves or rejects based on ajax outcomes
     return new Em.RSVP.Promise( function(resolve, reject){ resolve(); } );
   },

})

以下不是必需的,但是我用它将我的ajax请求包装在一个承诺中:

function ajaxPromise (url, type, hash) {
    return new Ember.RSVP.Promise(function(resolve, reject) {
        hash = hash || {};
        hash.url = url;
        hash.type = type;
        hash.dataType = 'json';
        hash.success = function(json) {
            Ember.run(null, resolve, json);
        };
        hash.error = function(json) {
           if (json && json.then) { json.then = null }
           Ember.run(null, reject, json);
        };
    $.ajax(hash);
    });
}

然后,您可以使用哈希中的任何其他参数传递它类型DELETE,或将它们添加到URL。 e.g。

deleteRecord: function(store, type, record) {
   var promise = new ajaxPromise(URL, "DELETE", hash);
   promise.then(function(result){
     //do stuff here with result
   });
   return promise
}