日期:2014-05-16  浏览次数:20761 次

Ext.Ajax.request和formPanel.getForm().submit()两种提交方法的异同

1、相同点:

a)都是使用异步提交的方式;

b)默认都是使用POST方式来提交数据;


2、不同点:

a)Request方法不可以使用waitMsg属性来设置在等待响应过程中显示的信息,而submit方法提交时这个设置是可用的(可以看到效果,而前面说的不可用是指设置了看不到效果);

b)Request方法必须将要提交的参数手动组织好然后作为名为params的参数的值才能提交到服务器,而submit方法会将表单内所有input元素组织好提交;

c)Request方法提交时,回调函数中会传入两个参数(response,option),前者是请求的响应对象,服务器对于请求的响应信息可以通过它的responseText属性得到(也就是

response.reponseText就可以得到服务器返回的字符串),第二个参数是提交的参数对象,一般不需要用到,如果要读取返回的响应信息,要先用Ext.decode方法将其resonseText属性值转换

成json对象才可以读取;如服务器端返回的是一个json格式的字符串:{success:true,msg:'sample'},则客户端要读取这个信息,可以这样:var returnResult = Ext.decode

(response.responseText); alert(returnResult.msg);submit的情况下回调函数参数是(form,action),如果想读取响应信息,只需要访问action对象的result属性就可以了,像上述同样的

返回信息,读取的示例:alert(action.result.msg);不过有一点要注意的是,当网络数据传输失败或信息丢失的情况下,action中可能没能取到服务器返回的消息,也就是说,result不一

定会存在msg属性,如果不经判断就访问,有可能会引发异常;

d)Request方法提交后,无论返回的json结果中success属性是否为true,回调函数都会到success:function()里面执行,所以在这种情况下,必须在success方法体里再到result.success进行

判断以得到真正的执行结果,所以,只有在出现网络错误,连不到服务器或找到响应页面(404)时,failure回调方法才会被执行;而Submit方法在返回的结果中,如果success为true的,就

会自动执行success:function,如果是false,则会执行failure:function了,所以没有必要再在里面判断success是true或false,另,跟request时一样,当出现网络错误或其它未知错误时

,failure:function也会被执行;

备注:造成这种结果的原因不难理解,因为在上面第三点提到,request请求的情况下返回的结果是以字符串的形式获取的,也就是说ext并未到其进行解析,所以它也识别不了里面返回的结

果是成功还是失败,只是把一个字符串带回来了,而submit方法提交时,返回的action.result对象已经将响应信息解析了,它能读取其中的success属性的值,所以能够根据不同的success属

性来执行相应的回调方法)

?

[原创] Ext.Ajax.request 与formPanel.getForm().submit() success的区别
formPanel提交方式:
Ext.MessageBox.wait('正在提数据, 请稍侯 ...', '提示');
xxxxFormPanel.getForm().submit({
timeout : 60,
success : function(form, action) {
// 业务成功
Ext.MessageBox.updateProgress(1);
Ext.MessageBox.hide();

},
failure : function(form, action) {
// 业务失败
Ext.MessageBox.updateProgress(1);
Ext.MessageBox.hide();

switch (action.failureType) {
case Ext.form.Action.CLIENT_INVALID :
Ext.Msg.alert('错误!', '存在未通过验证的数据!');
break;
case Ext.form.Action.CONNECT_FAILURE :
Ext.Msg.alert('错误!', '连接错误!');
break;
case Ext.form.Action.SERVER_INVALID :
Ext.Msg.alert('错误!', action.result.msg);
}
}
});

Ajax提交方式:
Ext.Ajax.request({
url : ...,
params : {
...
},
success : function(response, opts) {
var o = Ext.util.JSON.decode(response.responseText);
if( o.success){
// 业务执行成功
} else{
// 业务执行失败
}
},
failure : function(response, opts) {
// ? 此处怎么做,大家可以说说 :oops:
}
});


二者都可以接收服务器端返回的如下json串:
{success:true/false,msg:'xxxx'}

如果success为true,对于formPanel提交方式,程序会进入success回调函数;对于Ajax提交方式,程序也会进入success回调函数。
而区别在于如果success为false,对于formPanel提交方式,程序会进入failure回调函数;而Ajax提交方式,程序依然会进入success回调函数。

总结:
success的true和false可以用来表示业务的成功或者失败。
1、在formPanel提交方式中,成功后的操作要在success回调函数中进行,失败后的操作在failure回调函数中进行;
2、在Ajax提交方式中,业务的成功失败都应该在success回调函数中进行操作,而true或者false以o.success获得(具体见代码及注释)。