本篇主要介绍一下ExtJs常用的几个对JS语法的扩展支持,包括Ajax封装,函数事件操作封装,还有扩展的常用函数等。Ajax服务端交互式操作是提交到.NET MVC。后续服务端交互都采用这一方式实现。

一、ExtJs中的Ajax:Ext.Ajax.request

通过客户端向服务端发送Ajax请求,可以“直接”调用MVC的action方法,并传递参数,action返回值可以是普通字符串,也可以是json对象。请求可以添加自定义头信息。看下面例子:

1.异步请求,发送自定义请求头:

html页面如下:

[html]
<h1>Ajax服务端请求</h1>
<div class="content" id="div1">
<div>一共发起了<span id="span1" style="color:Red">0</span>次请求。</div>
</div>

我们先通过一个按钮单击事件触发ajax请求,服务端返回string到客户端,异步请求时,为请求添加自定义头“userHeader”,并在服务端获取。如下是js代码:

[Js]
Ext.onReady(function () {
    new Ext.Button({
        renderTo: "div1",text: "后台Ajax提交",handler: function () {
            Ext.Ajax.request({
                url: 'Ajax_Func1',headers: {
                    'userHeader': 'userMsg'
                },params: { a: 10,b: 20 },method: 'GET',success: function (response,options) {
                    Ext.MessageBox.alert('成功','从服务端获取结果: ' + response.responseText);
                },failure: function (response,options) {
                    Ext.MessageBox.alert('失败','请求超时或网络故障,错误编号:' + response.status);
                }
            });
        },id: "bt1"
    });

});

服务端MVC接受请求的action代码:

[C#]
public ContentResult Ajax_Func1(int a,int b)
        {
            string userHeaderMsg = Convert.ToString(Request.Headers["userHeader"]);
            return Content((a + b).ToString() + ",userHeader:" + userHeaderMsg);
        }

然后我们在火狐中调试:自定义请求头已被添加。

查看执行结果:

2.异步请求,返回json:

如果要返回json到客户端,MVC需要使用JsonResult的acton,自动将C#对象转换为json格式。客户端代码如下:

[Js]
Ext.onReady(function () {

    new Ext.Button({
        renderTo: "div1",text: "后台Ajax提交方式2返回JSON",handler: function () {
            Ext.Ajax.request({
                url: 'Ajax_Func2',params: { n: 10 },method: 'POST',callback: function (options,success,response) {
                    if (success) {
                        var responseJson = Ext.JSON.decode(response.responseText);

                        Ext.Msg.alert("成功",options.params.n + "的阶乘是:<font color='red'>" + responseJson.n1 + "</font><br />"
                      + options.params.n + "的累加是:<font color='red'>" + responseJson.n2 + "</font>");
                    } else {
                        Ext.Msg.confirm('失败',错误编号:[' + response.status + ']是否要重新发送?',function (btn) {
                                                if (btn == 'yes') {
                                                    Ext.Ajax.request(options);
                                                }
                                            });
                    }
                }
            });
        }
    });

});

服务端代码:

[C#]
public JsonResult Ajax_Func2(int n)
{
    int n1 = 1;
    int n2 = 0;
    for (int i = 1; i <= n; i++)
    {
        n1 *= i;
        n2 += i;
    }

    var data = new
    {
        n1 = n1,n2 = n2
    };

    return Json(data,JsonRequestBehavior.AllowGet);
}

查看执行结果,我们先看看火狐调试响应的结果,可以查看返回的json内容:

界面执行结果:

3.异步文件上传

ExtJs通过强大的内部封装,使ajax请求看起来可以直接提交二进制流数据。每当提交文件数据时,ExtJs会自动创建iframe,在iframe中提交。提交完成后又自动移去,一切显得天衣无缝。下面演示一个通过异步请求无刷新文件上传的例子:

[html]
<h1>Ajax文件上传</h1>
<div class="content" id="div2">
<form id="form1">
请选择文本文件:<input type="file" name="file" />
<input type="button" id="button1" value="上传" />
</form>
</div>
[Js]
//文件上传
    Ext.get("button1").on("click",function () {
        Ext.Ajax.request({
            url: "Ajax_FileUp",isupload: true,form: "form1",success: function (response) {
                Ext.MessageBox.alert("上传成功,文本文件内容:",response.responseText);
            }
        });
    });
[C#]
public ContentResult Ajax_FileUp(HttpPostedFileBase file)
        {
            System.IO.StreamReader r = new System.IO.StreamReader(file.InputStream,System.Text.UTF8Encoding.Default);
            var str = r.ReadToEnd();
            return Content(str);
        }

提交后我们发现,上传的文本文件内容已经被正确读取。

4.异步请求事件

当发起ajax请求之前,可以监听beforerequest事件,本例每当发起ajax事件时,都会把计算器+1:

[Js]
var ajaxCount = 0;
    //每当Ajax请求发起时触发:
    Ext.Ajax.on('beforerequest',function () { Ext.get("span1").update(++ajaxCount) },this);

这样,每当ajax发起就可以被记录,可用作日志等。

二、元素对象Ajax式更新:Ext.Updater,[已弃用]

ExtJs为我们提供了异步方式更新dom元素内容的支持。这可以用在一些异步交互性比较强的地方,例如webgame等。我们来看看具体实现方式。

我们先在视图中写这样的html:

[html]
<div id="div1" title="d1" style="width:50px; height:50px; position:absolute; background-color:Green; top:100px">1</div>
    <div id="div2">2</div>
    <form id="form1"><input id="a" name="a" value="20" /><input id="b" name="b" value="50" /></form>

1.单个元素的及时更新

现在,我要通过c#在服务端计算a+b的值,然后将结果填到div1元素里面:

[Js]
Ext.get("div1").getUpdater().update({
    url: "Ext/UpdaterFunc",b: 3 }
});

[c#]
public ContentResult UpdaterFunc(int a,int b)
        {
            return Content("a+b=" + (a + b));
        }

页面加载后,将自动更新div1。再看看另外一种写法:

[Js]
Ext.get("div1").load({
            url: "Ext/UpdaterFunc",scripts: true,b: 47 },text: "请等待..."
        });

2.通过提交表单更新

[Js]
Ext.get("div1").getUpdater().formUpdate("form1","Ext/UpdaterFunc");

效果一样,只不过提交的参数来源于表单,参数名为对应的name值。

3.周期性更新

[Js]
//周期性更新
        var up = new Ext.Updater("div1");
        up.startAutoRefresh(5,"Ext/UpdaterFunc",{ a: 10,b: 47 });

这段代码运行后将每隔5秒钟更新一次div1,用于需要适时核对服务端和客户端状态的情形。

Js代码
  1. //异步ajax调用
  2. /**
  3. * 异步调用ajax,成功后返回值,作为回调函数的参数 调用失败会提示
  4. *
  5. * @param {}
  6. * urlStr
  7. * @param {}
  8. * paramsObj
  9. * @param {}
  10. * callbackFunc
  11. */
  12. function ajaxCall(urlStr,paramsObj,callbackFunc) {
  13. Ext.Ajax.request({
  14. url : urlStr,
  15. params : paramsObj,
  16. method : 'POST',
  17. success : function(response) {
  18. if (callbackFunc) {
  19. var result = Ext.util.JSON
  20. .decode(response.responseText);
  21. var cbfn = callbackFunc.createCallback(result);
  22. cbfn();
  23. }
  24. },
  25. failure : function() {
  26. Ext.Msg.alert("提示","方法调用失败");
  27. }
  28. });
  29. }
//异步ajax调用
/**
 * 异步调用ajax,成功后返回值,作为回调函数的参数 调用失败会提示
 * 
 * @param {}
 *            urlStr
 * @param {}
 *            paramsObj
 * @param {}
 *            callbackFunc
 */
function ajaxCall(urlStr,callbackFunc) {
	Ext.Ajax.request({
				url : urlStr,params : paramsObj,method : 'POST',success : function(response) {
					if (callbackFunc) {
						var result = Ext.util.JSON
								.decode(response.responseText);
						var cbfn = callbackFunc.createCallback(result);
						cbfn();
					}
				},failure : function() {
					Ext.Msg.alert("提示","方法调用失败");
				}
			});
}
Js代码
  1. /**
  2. *通用JS 同步ajax调用 返回json Object
  3. *
  4. * @param {}
  5. * urlStr
  6. * @param {}
  7. * paramsstr 为字符串键值对形式“key=value&key2=value2”
  8. * @return {} 返回json Object
  9. */
  10. function ajaxSyncCall(urlStr,paramsstr) {
  11. var obj;
  12. var value;
  13. if (window.ActiveXObject) {
  14. obj = new ActiveXObject('Microsoft.XMLHTTP');
  15. } else if (window.XMLHttpRequest) {
  16. obj = new XMLHttpRequest();
  17. }
  18. obj.open('POST',urlStr,false);
  19. obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  20. obj.send(paramsstr);
  21. var result = Ext.util.JSON.decode(obj.responseText);
  22. return result;
  23. }
/**
 *通用JS 同步ajax调用 返回json Object
 * 
 * @param {}
 *            urlStr
 * @param {}
 *            paramsstr 为字符串键值对形式“key=value&key2=value2”
 * @return {} 返回json Object
 */
function ajaxSyncCall(urlStr,paramsstr) {
	var obj;
	var value;
	if (window.ActiveXObject) {
		obj = new ActiveXObject('Microsoft.XMLHTTP');
	} else if (window.XMLHttpRequest) {
		obj = new XMLHttpRequest();
	}
	obj.open('POST',false);
	obj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
	obj.send(paramsstr);
	var result = Ext.util.JSON.decode(obj.responseText);
	return result;
}
Js代码
  1. //EXTJS 同步ajax调用
  2. var conn = Ext.lib.Ajax.getConnectionObject().conn;
  3. conn.open("GET",'your url',false);
  4. conn.send(null);
  5. alert(conn.responseText);
//EXTJS 同步ajax调用
var conn = Ext.lib.Ajax.getConnectionObject().conn;
conn.open("GET",'your url',false);
conn.send(null);
alert(conn.responseText);

EXTJS 修改Ext.Ajax.request真正的请求方法Ext.lib.Ajax.request ,通过sync:true实现同步调用ajax

Js代码
  1. Ext.lib.Ajax.request = function(method,uri,cb,data,options) {
  2. if(options){
  3. var hs = options.headers;
  4. if(hs){
  5. for(var h in hs){
  6. if(hs.hasOwnProperty(h)){
  7. this.initHeader(h,hs[h],false);
  8. }
  9. }
  10. }
  11. if(options.xmlData){
  12. if (!hs || !hs['Content-Type']){
  13. this.initHeader('Content-Type','text/xml',false);
  14. }
  15. method = (method ? method : (options.method ? options.method : 'POST'));
  16. data = options.xmlData;
  17. }else if(options.jsonData){
  18. if (!hs || !hs['Content-Type']){
  19. this.initHeader('Content-Type','application/json',false);
  20. }
  21. method = (method ? method : (options.method ? options.method : 'POST'));
  22. data = typeof options.jsonData == 'object' ? Ext.encode(options.jsonData) : options.jsonData;
  23. }
  24. }
Ext.lib.Ajax.request = function(method,options) {     
    if(options){     
        var hs = options.headers;     
        if(hs){     
            for(var h in hs){     
                if(hs.hasOwnProperty(h)){     
                    this.initHeader(h,false);     
                }     
            }     
        }     
        if(options.xmlData){     
            if (!hs || !hs['Content-Type']){     
                this.initHeader('Content-Type','text/xml',false);     
            }     
            method = (method ? method : (options.method ? options.method : 'POST'));     
            data = options.xmlData;     
        }else if(options.jsonData){     
            if (!hs || !hs['Content-Type']){     
                this.initHeader('Content-Type','application/json',false);     
            }     
            method = (method ? method : (options.method ? options.method : 'POST'));     
            data = typeof options.jsonData == 'object' ? Ext.encode(options.jsonData) : options.jsonData;     
        }     
    }

return this["sync" in options ? "syncRequest" : "asyncRequest"](method,data);//这句制定调用的方法,如果sync传递了就调用syncRequest, 否则调用原来的方法asyncRequest};

Js代码
  1. Ext.lib.Ajax.syncRequest = function(method,callback,postData)
  2. {
  3. var o = this.getConnectionObject();
  4. if (!o) {
  5. return null;
  6. }
  7. else {
  8. o.conn.open(method,false);
  9. if (this.useDefaultXhrHeader) {
  10. if (!this.defaultHeaders['X-Requested-With']) {
  11. this.initHeader('X-Requested-With',this.defaultXhrHeader,true);
  12. }
  13. }
  14. if(postData && this.useDefaultHeader && (!this.hasHeaders || !this.headers['Content-Type'])){
  15. this.initHeader('Content-Type',this.defaultPostHeader);
  16. }
  17. if (this.hasDefaultHeaders || this.hasHeaders) {
  18. this.setHeader(o);
  19. }
  20. o.conn.send(postData || null);
  21. this.handleTransactionResponse(o,callback);
  22. return o;
  23. }
  24. };
Ext.lib.Ajax.syncRequest = function(method,postData)     
{     
    var o = this.getConnectionObject();     
   
    if (!o) {     
        return null;     
    }     
    else {     
        o.conn.open(method,false);     
   
        if (this.useDefaultXhrHeader) {     
            if (!this.defaultHeaders['X-Requested-With']) {     
                this.initHeader('X-Requested-With',this.defaultXhrHeader,true);     
            }     
        }     
   
        if(postData && this.useDefaultHeader && (!this.hasHeaders || !this.headers['Content-Type'])){     
            this.initHeader('Content-Type',this.defaultPostHeader);     
        }     
   
        if (this.hasDefaultHeaders || this.hasHeaders) {     
            this.setHeader(o);     
        }     
   
        o.conn.send(postData || null);     
        this.handleTransactionResponse(o,callback);     
        return o;     
    }     
};

Js代码
  1. //调用
  2. Ext.Ajax.request({
  3. url:'',
  4. scope:this,
  5. sync:true,
  6. success:function(){}
  7. });

Extjs 中的ajax的更多相关文章

  1. 关于h5中的fetch方法解读(小结)

    这篇文章主要介绍了关于h5中的fetch方法解读(小结),fetch身为H5中的一个新对象,他的诞生,是为了取代ajax的存在而出现,有兴趣的可以了解一下

  2. ios – 使用NSURLSession获取JSON数据

    我试图从谷歌距离api使用NSURLSession获取数据,但如下所示,当我打印响应和数据时,我得到的结果为NULL.可能是什么问题?

  3. ios – 错误域= com.alamofire.error.serialization.response代码= -1011“请求失败:禁止

    任何人都可以帮我解决以下错误–>在AFNetworking2.5中使用“删除”方法时出错解决方法我发现,如果我的手机时钟不同步……它不允许我更新…也许检查你的手机设置到正确的时间“自动区”,看看是否有效…

  4. iOS网页/原生应用Facebook登录弹出 – 失败?

    如果我重新启动app/web-app,用户将自动登录,并重定向到成功页面.我认为是导致问题的原因当您在Firefox/Chrome/Safari浏览器中运行网页时,Facebook登录对话框会弹出一个弹出窗口或另一个选项卡.我相信这是这个弹出页面的一个问题,以及当成功登录时Javascript如何与自身通信.window.close的东西没有返回的根页面…失败的解决方法由于应用程序挂在前面提到的URL上,我决定在shouldStartLoadWithRequest(…)中添加if语句以强制UIWebvie

  5. ios – Watchkit新会话不起作用

    我的手表扩展中有两个视图控制器.每当我打电话时我只得到第一个视图控制器的响应,并在第二个viewcontroller中得到错误WCSession在app和watch扩展中启动.任何建议?

  6. ios – OpenCV构建问题,找不到ext/atomicity.h

    我得到编译器错误抱怨在构建包含OpenCV的项目时.环境是针对iOS的Xcode4.5.它为模拟器编译良好,但在为设备构建时失败.这是错误文本:我正在使用opencv2.framework,使用指令here构建cmake.解决方法默认情况下,XCode4.5使用libc(支持C11的LLVMC标准库)生成要构建的新项目.但OpenCV期望针对GNUlibstd

  7. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

  8. ios – 保存从查询中获取的用户的属性(即不在currentUser上)

    我有兴趣根据currentUser执行的操作将属性保存到数据库中的用户.基于以下代码,我收到错误消息“除非已通过logIn或signUp验证用户,否则无法保存用户”我想知道是否有一个解决方法,我可以将属性保存到foundUser,而无需登录该用户.谢谢你的帮助!解决方法如果要更新当前不是登录用户的用户,则需要使用主密钥调用Parse.您可以从CloudCode执行此操作;并从您的iOS项目中调用它;

  9. 在iOS中使用NSJSONSerialization进行JSON解析

    解决方法首先在您的JSON响应字典中,在“RESPONSE”键下,您有一个数组而不是字典,该数组包含字典对象.所以要提取用户名和电子邮件ID,如下所示

  10. Xcode:Alamofire获得String响应

    我是IOS开发的新手,目前正在与Alamofire学习网络我正在尝试登录…每当凭证正确时,.PHP文件返回一个json,我可以通过以下代码从Alamofire获取json:现在……当凭证错误时,.PHP不会给json..而且它返回一个字符串..例如“wrong_password”或“userLocked”等等……如何通过Alamofire获得String响应?解决方法如果您希望JSON响应使用.responseJSON,如果您想要String响应,请使用.responseString.如果你想两者同时使用

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部