【问题标题】:Dojo datagrid jsonrest response headersDojo datagrid jsonrest 响应标头
【发布时间】:2012-12-07 02:21:23
【问题描述】:

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

API provides 一个返回响应对象的响应错误事件:

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

使用它我可以成功访问我的自定义响应标头。但是,似乎没有办法在请求成功时获取响应对象。我一直在使用 undocumented 私有事件 _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);

有没有更好的办法?

【问题讨论】:

    标签: dojo http-headers dojox.grid


    【解决方案1】:

    我今天看完这篇文章后解决了这个问题,我想我会反馈的。

    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() 链。

    提醒一句,这段代码是为了发布在这里而修改的,实际上是从另一个也覆盖query()的中间类继承而来的,但这里的基础知识非常好。

    【讨论】:

    • 在标准 json 存储中应该是这样的: var results = this.inherited(arguments); results.then(function () { var headers = results.ioArgs.xhr.getResponseHeader('my-header'); });
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多