关于JavaScript中this的使用,这是一个由来已久的问题了。
我们这里就不介绍它的发展历史了,只结合具体的例子,告诉大家可能会遇到什么问题,在遇到这些问题时EXT是如何解决的。
在使用EXT时,最常碰到的就是使用Ajax回调函数时出现的问题,如下面的代码所示:
- <input type="text" name="text" id="text">
- <input type="button" name="button" id="button" value="button">
现在的HTML 页面中有一个text输入框和一个按钮。我们希望按下这个按钮之后,能用Ajax去后台读取数据,然后把后台响应的数据放到text中,实现过程如下:
- var proxy = new Ext.data.HttpProxy({url:'xxx.jsp'});
后台需要返回EXT所需要的JSON格式的数据,下面的内容就是后台使用JSP的一个范例,如下面的代码所示。
- function doSuccess(response) {
- text.dom.value = response.responseText;
- }
-
- Ext.onReady(function(){
-
- Ext.get('button').on('click', function(){
- var text = Ext.get('text');
- Ext.lib.Ajax.request(
- 'POST',
- '08.txt',
- {success:doSuccess},
- 'param=' + encodeURIComponent(text.dom.value)
- );
- });
- });
在上面的代码中,Ajax已经用Ext.get('text')获得了text,以为后面可以直接使用,没想到回调函数success不会按照你写的顺序去执行。
当然,也不会像你所想的那样使用局部变量text。
实际上,如果什么都不做,仅仅只是使用回调函数,你不得不再次使用Ext.get('text')重新获得元素,否则浏览器就会报text未定义的错误。
在此使用Ext.get('text')重新获取对象还比较简单,在有些情况下不容易获得需要处理的对象,
我们要在发送Ajax请求之前获取回调函数中需要操作的对象,有两种方法可供选择:scope和createDelegate。
1. 为Ajax设置scope
- function doSuccess(response) {
- this.dom.value = response.responseText;
- }
- Ext.lib.Ajax.request(
- 'POST',
- '08.txt',
- {success:doSuccess,scope:text},
- 'param=' + encodeURIComponent(text.dom.value)
- );
在Ajax的callback参数部分添加一个scope:text,把回调函数的scope指向text,它的作用就是把doSuccess函数里的this指向text对象。
然后再把doSuccess里改成this.dom. value,这样就可以了。
如果想再次在回调函数里用某个对象,必须配上scope,这样就能在回调函数中使用this对它进行操作了。
2. 为success添加createDelegate()。
- function doSuccess(response) {
- this.dom.value = response.responseText;
- }
-
- Ext.lib.Ajax.request(
- 'POST',
- '08.txt',
- {success:doSuccess.createDelegate(text)},
- 'param=' + encodeURIComponent(text.dom.value)
- );
createDelegate只能在function上调用,它把函数里的this强行指向我们需要的对象,
然后我们就可以在回调函数doSuccess里直接通过this来引用createDelegate()中指定的这个对象了。
它可以作为解决this问题的一个备选方案。
如果让我选择,我会尽量选择scope,因为createDelegate是要对原来的函数进行封装,重新生成function对象。
简单环境下,scope就够用了,倒是createDelegate还有其他功能,比如修改调用参数等。
分享到:
相关推荐
`createDelegate` 是一个在某些编程语言或框架中常见的函数,用于创建委托或者代理对象。在JavaScript中,它经常被用作...通过学习和理解`createDelegate`的工作原理和用法,我们可以编写出更加健壮和可维护的代码。
10.9 关于scope和createDelegate() ....247 10.10 DWR与EXT整合..................................249 10.10.1 在EXT中直接使用DWR......249 10.10.2 DWRProxy............................250 10.10.3 ...
clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed)); } ``` 在 onQuerySucceeded 方法中,我们可以获取当前用户所属的...
- `call`和`apply`方法可以改变`this`的值,但会立即执行函数,而`createDelegate`则不会。 总的来说,ExtJS的事件处理机制增强了JavaScript的原生事件处理能力,提供了更强大、更灵活的事件管理,同时也确保了跨...
9. **委托创建(Delegate.CreateDelegate)**:反射可以用于创建委托实例,将方法绑定到一个事件处理程序: ```csharp MethodInfo handlerMethod = myType.GetMethod("EventHandlerMethod"); Delegate ...
面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,旨在将系统中的关注点分离,提高代码的可重用性、可维护性和模块化。在C#中,我们可以利用Unity、PostSharp或者.NET框架自带的System.Interactive...
9. **Ext.DomHelper类**:用于动态创建和修改DOM元素,提供了简洁的API。 10. **Ext.Template类**:模板系统,用于快速生成HTML结构,支持变量替换和内联函数调用。 11. **Ext.EventManager类**:负责事件注册、...
handler: this.insertImage.createDelegate(this), scope: this }; } ``` 3. 插入图片:定义`insertImage`方法,用于弹出文件选择对话框,获取图片文件后插入编辑器。 ```javascript insertImage: function() {...
此外,如果你需要频繁地通过反射访问某个静态字段或属性,可以考虑使用`Delegate.CreateDelegate`生成委托,这将显著提升性能。 对于Java开发者,反射在原理上与.NET类似,但语法和API有所不同。在Java中,使用`...
反射的定义是审查元数据并收集关于它的类型信息的能力。元数据是编译以后最基本的数据单元,它是一个大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表、一个字段定义表和一个方法定义表等。 反射的原理...
1. 接口与委托互转:Marshal.GetFunctionPointerForDelegate和Marshal.CreateDelegate方法可以实现接口和委托之间的转换,这对于调用非托管DLL函数非常有用。 2. 引用类型转换:Marshal.IsTypeVisibleFromCom和...
2. 动态委托:还可以通过Delegate的CreateDelegate方法创建一个指向特定方法的委托,然后通过委托调用方法。 五、访问字段和属性 1. FieldInfo类用于访问字段,通过Type对象的GetField或GetFields方法获取FieldInfo...
通过反射,你可以获取关于类型、方法、属性、事件等的详细信息,并能在运行时创建和调用它们。System.Reflection命名空间包含了用于反射的核心类,如Assembly、Type、MethodInfo、FieldInfo等。 2. **命名空间与装...
这个"详细的C#反射例子(项目文件)"显然包含了关于如何使用C#反射的实际应用示例,这对于理解并掌握这一核心概念至关重要。 反射允许程序员在运行时执行以下操作: 1. **获取类型信息**:通过Type类,可以获取...
10. **委托与事件(Delegate.CreateDelegate)**:反射可以用来创建委托对象,从而允许动态绑定到方法。这在处理事件和回调函数时非常有用。 11. **自定义属性(Attribute)**:C#支持元数据注解,可以通过反射获取...
在C#编程中,泛型和反射是两种强大的特性,它们各自有着独特的功能,并且在特定情况下可以结合使用,以实现更加灵活和高效的代码。本文将深入探讨这两个概念及其联合应用。 首先,让我们理解什么是泛型。泛型是C# ...
本文将重点讲解如何在C#的Winform应用中动态调用C++和C#编写的DLL,并将DLL作为嵌入资源处理,避免因丢失DLL文件而引发的问题。 首先,我们需要理解DLL的工作原理。DLL文件包含可执行代码和数据,当一个应用程序...
在.NET框架中,C#语言提供了强大的类型安全和编译时检查,但有时我们需要在运行时动态地加载和调用DLL中的函数,这种情况通常涉及到“反射”这一核心特性。本篇将深入探讨如何使用C#进行动态DLL调用以及如何向目标...