基于变态的需求,远程服务器只接受post方式数据,所以不能用extjs的jsonp方式去跨域请求数据,就只好用flash的方式了,当然,这也需要服务器端的支持.
代码如下:
/**
* 使用Flash方式进行Post跨越调用的Proxy类
*/
Ext.define('GBox.data.PostpProxy', {
requires:['Ext.util.MixedCollection'],
doRequest:function (operation, callback, scope) {
var writer = this.getWriter(),
request = this.buildRequest(operation, callback, scope);
if (operation.allowWrite()) {
request = writer.write(request);
}
/**
* 调用父类构造回调函数
* @type {*}
*/
var extCB = this.createRequestCallback(request, operation, callback, scope);
/**
* 由于自定义的flash跨越回调方法的参数与ext的不同,所以在这组装一下
* @param data
*/
var successCallback = function (data) {
extCB(request, true, {
request:request,
requestId:1,
responseText:data,
responseXML:null,
status:200,
statusText:'ok',
getAllResponseHeaders:Ext.emptyFn,
getResponseHeader:Ext.emptyFn
});
};
var timeoutCallback = function (data) {
Ext.MessageBox.alert('出错了','请求超时!');
var strParams = "";
for (var p in params) {
strParams += p + "=" + params[p] + "&";
}
if ("" != strParams) {
strParams = strParams.substring(0, strParams.length - 1);
}
/**
* 调用自定义的flash跨越请求方法
*/
pro.net.http.postp(
request.url,
strParams,
successCallback,
{
errorFn:errorCallback,
timeoutFn:timeoutCallback
}
);
return request;
},
createRequestCallback:function (request, operation, callback, scope) {
var me = this;
return function (options, success, response) {
me.processResponse(success, operation, request, response, callback, scope);
};
}
});
使用方法
与使用其它ajax的代理方式完全一样
Ext.define('User', {
extend:'Ext.data.Model',
fields:[
{name:'employeeId', type:'string'},
{name:'systemLevel', type:'int'},
{name:'email', type:'string'},
{name:'employeeName', type:'string'},
{name:'area', type:'string'}
]
});
var postpStore = new Ext.data.Store({
autoLoad:false,
model:'User',
pageSize:10,
proxy:{
// 这儿就是使用我们自定义的代理了
type:'postp',
url:'http://172.17.**.**/get?pid=2001&enc=utf-8&res=json',
reader:{
type:'json',
root:'data.result',
totalProperty:'page.total'
}
}
});
var grid = Ext.create('Ext.grid.Panel', {
title:'用户',
store:postpStore,
columns:[
{ header:'employeeId', dataIndex:'employeeId' },
{ header:'systemLevel', dataIndex:'systemLevel'},
{ header:'employeeName', dataIndex:'employeeName'},
{ header:'area', dataIndex:'area'},
{ header:'email', dataIndex:'email' }
],
dockedItems:[
{
xtype:'toolbar',
items:[
{
text:'查询',
iconCls:'icon-search',
handler:function () {
Ext.apply(postpStore.proxy.extraParams, {
modelName:1
});
postpStore.loadPage(1);
}
}
]}
],
bbar:Ext.create('Ext.PagingToolbar', {
store:postpStore,
pageSize:10,
displayInfo:true,
displayMsg:'显示 {0} - {1} 条,共计 {2} 条',
emptyMsg:"没有数据"
}),
height:400,
width:500,
renderTo:'showUser'
});
代码如下:
/**
* 使用Flash方式进行Post跨越调用的Proxy类
*/
Ext.define('GBox.data.PostpProxy', {
requires:['Ext.util.MixedCollection'],
extend:'Ext.data.proxy.Server',
// 定义代理别名,很重要
alias:'proxy.postp',doRequest:function (operation, callback, scope) {
var writer = this.getWriter(),
request = this.buildRequest(operation, callback, scope);
if (operation.allowWrite()) {
request = writer.write(request);
}
/**
* 调用父类构造回调函数
* @type {*}
*/
var extCB = this.createRequestCallback(request, operation, callback, scope);
/**
* 由于自定义的flash跨越回调方法的参数与ext的不同,所以在这组装一下
* @param data
*/
var successCallback = function (data) {
extCB(request, true, {
request:request,
requestId:1,
responseText:data,
responseXML:null,
status:200,
statusText:'ok',
getAllResponseHeaders:Ext.emptyFn,
getResponseHeader:Ext.emptyFn
});
};
var timeoutCallback = function (data) {
Ext.MessageBox.alert('出错了','请求超时!');
};
var errorCallback = function (data) {
Ext.MessageBox.alert('出错了','服务器错误!');};
var params = request.params;var strParams = "";
for (var p in params) {
strParams += p + "=" + params[p] + "&";
}
if ("" != strParams) {
strParams = strParams.substring(0, strParams.length - 1);
}
/**
* 调用自定义的flash跨越请求方法
*/
pro.net.http.postp(
request.url,
strParams,
successCallback,
{
errorFn:errorCallback,
timeoutFn:timeoutCallback
}
);
return request;
},
createRequestCallback:function (request, operation, callback, scope) {
var me = this;
return function (options, success, response) {
me.processResponse(success, operation, request, response, callback, scope);
};
}
});
使用方法
与使用其它ajax的代理方式完全一样
Ext.define('User', {
extend:'Ext.data.Model',
fields:[
{name:'employeeId', type:'string'},
{name:'systemLevel', type:'int'},
{name:'email', type:'string'},
{name:'employeeName', type:'string'},
{name:'area', type:'string'}
]
});
var postpStore = new Ext.data.Store({
autoLoad:false,
model:'User',
pageSize:10,
proxy:{
// 这儿就是使用我们自定义的代理了
type:'postp',
url:'http://172.17.**.**/get?pid=2001&enc=utf-8&res=json',
reader:{
type:'json',
root:'data.result',
totalProperty:'page.total'
}
}
});
var grid = Ext.create('Ext.grid.Panel', {
title:'用户',
store:postpStore,
columns:[
{ header:'employeeId', dataIndex:'employeeId' },
{ header:'systemLevel', dataIndex:'systemLevel'},
{ header:'employeeName', dataIndex:'employeeName'},
{ header:'area', dataIndex:'area'},
{ header:'email', dataIndex:'email' }
],
dockedItems:[
{
xtype:'toolbar',
items:[
{
text:'查询',
iconCls:'icon-search',
handler:function () {
Ext.apply(postpStore.proxy.extraParams, {
modelName:1
});
postpStore.loadPage(1);
}
}
]}
],
bbar:Ext.create('Ext.PagingToolbar', {
store:postpStore,
pageSize:10,
displayInfo:true,
displayMsg:'显示 {0} - {1} 条,共计 {2} 条',
emptyMsg:"没有数据"
}),
height:400,
width:500,
renderTo:'showUser'
});