Dojo datagrid jsonrest响应头

时间:2012-12-19 16:59:50

标签: dojo http-headers dojox.grid

我想使用自定义标头提供有关响应数据的更多信息。是否可以通过对象存储(dojo 1.7)将dojo数据网格的响应中的头文件连接到jsonRest对象?当你发出XHR请求时,我看到这是possible,但在这种情况下,它是由网格发出的。

API provides响应错误的事件,它返回响应对象:

  on(this.grid, 'FetchError', function (response, req) {
      var header = response.xhr.getAllResponseHeaders();
  });

使用此功能,我可以成功访问自定义响应标头。但是,在请求成功时似乎没有办法获取响应对象。我之前一直在使用undocumented私有事件_onFetchComplete和aspect,但是,这不允许访问响应对象,只是响应值

aspect.after(this.grid, '_onFetchComplete', function (response, request) 
{
 ///unable to get headers, response is the returned values
}, true);

编辑: 我设法得到了一些工作,但我怀疑它是非常过度设计的,有更好理解的人可以提出一个更简单的解决方案。我最后添加了一个方面,允许我获取休息存储中的延迟对象,该对象返回到对象存储区。在这里,我向deffered添加了一个新函数来返回标题。然后我使用dojo hitch连接到对象存储的onFetch(因为我需要当前范围内的结果)。这对我来说似乎很混乱

aspect.around(restStore, "query", function (original) {
    return function (method, args) {
        var def = original.call(this, method, args);
        def.headers = deferred1.then(function () {
            var hd = def.ioArgs.xhr.getResponseHeader("myHeader");
            return hd;
        });
        return def;
    };
});

aspect.after(objectStore, 'onFetch', lang.hitch(this, function (response) {
    response.headers.then(lang.hitch(this, function (evt) {
        var headerResult = evt;
    }));
}), true);

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

我在阅读这篇文章后今天解决了这个问题,以为我会反馈。

dojo/store/JsonRest也解决了这个问题,但我的代码略有不同。

var MyStore = declare(JsonRest, {
    query: function () {
        var results = this.inherited(arguments);
        console.log('Results: ', results);
        results.response.then(function (res) {
            var myheader = res.xhr.getResponseHeader('My-Header');
            doSomethingWith(myheader);
        });
        return results;
    }
});

所以你覆盖普通的query()函数,让它执行并返回它的promise,并将你自己的监听器附加到它的'response'成员解析中,你可以在其中访问带有头的xhr对象。这应该让你解释JsonRest结果,同时很好地适应查询链()所有调用者。

提醒一句,此代码已修改为在此处发布,并且实际上是继承自另一个也超过query()的中间类,但这里的基础知识非常合理。

答案 1 :(得分:0)

如果你想要的是从服务器获取信息,那么cookie中的自定义键值也可以是一个解决方案,这是我的情况,首先我是在寻找自定义响应标题,但我无法做到让它工作所以我做了cookie方式获取网格数据后的信息:

dojo.connect(grid, "_onFetchComplete", function (){
    doSomethingWith(dojo.cookie("My-Key"));
});

这对于为分页数据网格中的所有行呈现SUM(字段)非常有用,而不仅仅是当前页面中包含的那些行。在服务器中,您可以获取COUNT和SUM,COUNT将在Content-Range标头中发送,SUM可以在cookie中发送。