如何用Extjs Ajax来调用WCF服务呢?首先请看http://erichauser.net/2007/11/02/wcf-35-json-and-extjs/。
主要有两步:
1: Ext.lib.Ajax.defaultPostHeader = 'application/json'; 2: Ext.Ajax.request({url: '...',
method: 'POST',
params: Ext.util.JSON.encode(...),
}); 第一步设置全局变量Ext.lib.Ajax.defaultPostHeader,第二步设置params: Ext.util.JSON.encode({...})。这在直接调用Ajax是可行的,但是如果在Store中也这么写就会出错如:
new Ext.data.GroupingStore({ proxy: new Ext.data.HttpProxy({ method: 'POST', url: '..' , params: Ext.util.JSON.encode( { ... } ) }) }).load( );
为什么呢?原来Store中用Proxy而不是直接使用Ajax,params不正确,看文档Store还有一个baseParams的Config Option,试了也不行,再看文档load方法还可以传参数,试了还不行!没办法了,跟踪源文件。终于发现了原因:load()->execute()->var params = Ext.apply({}, options.params, this.baseParams);就是这句话,导致params最终是一个object对象,而Ext.util.JSON.encode({...})返回的是一个string对象。那怎么办呢,总不能改源文件吧?继续调试,这回就要看Ajax到底是怎么工作的,这就需要ext-base-debug.js文件了。调试到Ext.lib.Ajax.request()方法
,这是惊奇的发现有jsonData, headers这样两个Config Option,马上找文档,可是没有找到?难道是忘了写?那就先改吧:Ext.Ajax.request({ url: '...' ,
method: "POST" , jsonData: Ext.util.JSON.encode( { month: '2009/9/1' } ) });注意把params改为jsonData,然后不需要Ext.lib.Ajax.defaultPostHeader = 'application/json'; 运行可以,照样子修改Stroe new Ext.data.GroupingStore({
proxy: new Ext.data.HttpProxy({
method: 'POST',
url: '..'
, jsonData: Ext.util.JSON.encode( { ... } )
})
}).load( );
也行了。原来Extjs Ajax 还可以这样写,神奇了。
所以说还是要看原代码的!
浙公网安备 33010602011771号