2

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

API 为返回响应对象的响应错误提供了一个事件:

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

使用它,我可以成功访问我的自定义响应标头。但是,似乎没有办法在请求成功时获取响应对象。我一直在使用未记录的私人事件 _onFetchComplete 和方面之后,但是,这不允许访问响应对象,只允许访问响应值

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

编辑:我设法得到了一些工作,但我怀疑它是过度设计的,有更好理解的人可以想出一个更简单的解决方案。我最终添加了方面,以允许我在返回到对象存储的其余存储中获取延迟对象。在这里,我向 defered 添加了一个新函数以返回标头。然后,我使用 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);

有没有更好的办法?

4

2 回答 2

2

I solved this today after reading this post, thought I'd feed back.

dojo/store/JsonRest solves it also but my code ended up slightly different.

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

So you override the normal query() function, let it execute and return its promise, and attach your own listener to its 'response' member resolving, in which you can access the xhr object that has the headers. This ought to let you interpret the JsonRest result while fitting nicely into the chain of the query() all invokers.

One word of warning, this code is modified for posting here, and actually inherited from another intermediary class that also overrode query(), but the basics here are pretty sound.

于 2013-11-20T11:56:37.763 回答
0

如果您想要从服务器获取信息,那么 cookie 中的自定义键值也可以是一种解决方案,这就是我的情况,首先我正在寻找自定义响应标头,但我无法使其工作,所以我获取网格数据后cookie方式是否获取信息:

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

例如,这对于为分页数据网格中的所有行提供 SUM(field) 很有用,而不仅仅是当前页面中包含的行。在服务器中,您可以获取 COUNT 和 SUM,COUNT 将在 Content-Range 标头中发送,SUM 可以在 cookie 中发送。

于 2014-08-10T00:55:06.100 回答