2012-12-19 108 views
2

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

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

编辑: 我设法得到的东西的工作,但我怀疑它是非常过分的设计和一个更好的理解的人可以拿出一个更简单的解决方案。我最后添加了方面,让我能够在返回到对象存储的其余存储中获取延迟对象。在这里,我添加了一个新的函数来返回头文件。然后我使用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

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

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()功能,让它执行并返回其承诺,并附上自己的监听器,它的“响应”成员解决,在其中您可以访问具有头XHR对象。这应该让你解释JsonRest结果,同时很好地适应query()所有调用者的链。

一个字的警告,这段代码被修改为张贴在这里,实际上从另一个中介类继承,也覆盖了query(),但这里的基础是非常合理的。

+1

这将在标准json商店:var results = this.inherited(arguments); (function(){ var headers = results.ioArgs.xhr.getResponseHeader('my-header'); }); –

0

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

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

例如向在场的所有行的SUM(场)的分页数据网格,而不是只有那些包含这是非常有用在当前页面中。在服务器中,您可以获取COUNT和SUM,COUNT将在Content-Range标头中发送,SUM可以在cookie中发送。