`
objectbean
  • 浏览: 15066 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

9.关于scope和createDelegate()

    博客分类:
  • Ext
阅读更多

关于JavaScript中this的使用,这是一个由来已久的问题了。

我们这里就不介绍它的发展历史了,只结合具体的例子,告诉大家可能会遇到什么问题,在遇到这些问题时EXT是如何解决的。

在使用EXT时,最常碰到的就是使用Ajax回调函数时出现的问题,如下面的代码所示:

  1. <input type="text" name="text" id="text">  
  2. <input type="button" name="button" id="button" value="button">  



现在的HTML 页面中有一个text输入框和一个按钮。我们希望按下这个按钮之后,能用Ajax去后台读取数据,然后把后台响应的数据放到text中,实现过程如下:

  1. var proxy = new Ext.data.HttpProxy({url:'xxx.jsp'});                  



后台需要返回EXT所需要的JSON格式的数据,下面的内容就是后台使用JSP的一个范例,如下面的代码所示。

  1. function doSuccess(response) {  
  2.     text.dom.value = response.responseText;  
  3. }  
  4.    
  5. Ext.onReady(function(){  
  6.    
  7.     Ext.get('button').on('click'function(){  
  8.         var text = Ext.get('text');  
  9.         Ext.lib.Ajax.request(  
  10.             'POST',  
  11.             '08.txt',  
  12.             {success:doSuccess},  
  13.             'param=' + encodeURIComponent(text.dom.value)  
  14.         );  
  15.     });  
  16. });                 



在上面的代码中,Ajax已经用Ext.get('text')获得了text,以为后面可以直接使用,没想到回调函数success不会按照你写的顺序去执行。
当然,也不会像你所想的那样使用局部变量text。

实际上,如果什么都不做,仅仅只是使用回调函数,你不得不再次使用Ext.get('text')重新获得元素,否则浏览器就会报text未定义的错误。

在此使用Ext.get('text')重新获取对象还比较简单,在有些情况下不容易获得需要处理的对象,
我们要在发送Ajax请求之前获取回调函数中需要操作的对象,有两种方法可供选择:scope和createDelegate。

1. 为Ajax设置scope

  1. function doSuccess(response) {  
  2.      this.dom.value = response.responseText;  
  3.  }  
  4.  Ext.lib.Ajax.request(  
  5.      'POST',  
  6.      '08.txt',  
  7.      {success:doSuccess,scope:text},  
  8.      'param=' + encodeURIComponent(text.dom.value)  
  9.  );    



在Ajax的callback参数部分添加一个scope:text,把回调函数的scope指向text,它的作用就是把doSuccess函数里的this指向text对象。
然后再把doSuccess里改成this.dom. value,这样就可以了。
如果想再次在回调函数里用某个对象,必须配上scope,这样就能在回调函数中使用this对它进行操作了。

2. 为success添加createDelegate()。

  1. function doSuccess(response) {  
  2.       this.dom.value = response.responseText;  
  3.   }  
  4.    
  5.   Ext.lib.Ajax.request(  
  6.       'POST',  
  7.       '08.txt',  
  8.       {success:doSuccess.createDelegate(text)},  
  9.       'param=' + encodeURIComponent(text.dom.value)  
  10.   );  



createDelegate只能在function上调用,它把函数里的this强行指向我们需要的对象,
然后我们就可以在回调函数doSuccess里直接通过this来引用createDelegate()中指定的这个对象了。
它可以作为解决this问题的一个备选方案。

如果让我选择,我会尽量选择scope,因为createDelegate是要对原来的函数进行封装,重新生成function对象。
简单环境下,scope就够用了,倒是createDelegate还有其他功能,比如修改调用参数等。

分享到:
评论

相关推荐

    简析 createDelegate

    `createDelegate` 是一个在某些编程语言或框架中常见的函数,用于创建委托或者代理对象。在JavaScript中,它经常被用作...通过学习和理解`createDelegate`的工作原理和用法,我们可以编写出更加健壮和可维护的代码。

    Ext深入浅出 数据传输

    10.9 关于scope和createDelegate() ....247 10.10 DWR与EXT整合..................................249 10.10.1 在EXT中直接使用DWR......249 10.10.2 DWRProxy............................250 10.10.3 ...

    js解决sharepoint权限问题

    clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed)); } ``` 在 onQuerySucceeded 方法中,我们可以获取当前用户所属的...

    ExtJS 事件笔记

    - `call`和`apply`方法可以改变`this`的值,但会立即执行函数,而`createDelegate`则不会。 总的来说,ExtJS的事件处理机制增强了JavaScript的原生事件处理能力,提供了更强大、更灵活的事件管理,同时也确保了跨...

    Reflex-function-demo.zip_DEMO

    9. **委托创建(Delegate.CreateDelegate)**:反射可以用于创建委托实例,将方法绑定到一个事件处理程序: ```csharp MethodInfo handlerMethod = myType.GetMethod("EventHandlerMethod"); Delegate ...

    C# 面向切面编程实例

    面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,旨在将系统中的关注点分离,提高代码的可重用性、可维护性和模块化。在C#中,我们可以利用Unity、PostSharp或者.NET框架自带的System.Interactive...

    EXT核心API详解.doc

    9. **Ext.DomHelper类**:用于动态创建和修改DOM元素,提供了简洁的API。 10. **Ext.Template类**:模板系统,用于快速生成HTML结构,支持变量替换和内联函数调用。 11. **Ext.EventManager类**:负责事件注册、...

    EXT扩展Htmleditor,在工具栏中添加插入图片按钮,可选择图片插入到编辑器中(也可添加其他功能按钮)

    handler: this.insertImage.createDelegate(this), scope: this }; } ``` 3. 插入图片:定义`insertImage`方法,用于弹出文件选择对话框,获取图片文件后插入编辑器。 ```javascript insertImage: function() {...

    dotnet 5 静态字段和属性的反射获取 没有想象中那么伤性能.rar

    此外,如果你需要频繁地通过反射访问某个静态字段或属性,可以考虑使用`Delegate.CreateDelegate`生成委托,这将显著提升性能。 对于Java开发者,反射在原理上与.NET类似,但语法和API有所不同。在Java中,使用`...

    C#反射+委托案例 c#经典案例.pdf

    反射的定义是审查元数据并收集关于它的类型信息的能力。元数据是编译以后最基本的数据单元,它是一个大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表、一个字段定义表和一个方法定义表等。 反射的原理...

    Marshal类的使用

    1. 接口与委托互转:Marshal.GetFunctionPointerForDelegate和Marshal.CreateDelegate方法可以实现接口和委托之间的转换,这对于调用非托管DLL函数非常有用。 2. 引用类型转换:Marshal.IsTypeVisibleFromCom和...

    C#反射例子.是学习c#反射的好东西

    2. 动态委托:还可以通过Delegate的CreateDelegate方法创建一个指向特定方法的委托,然后通过委托调用方法。 五、访问字段和属性 1. FieldInfo类用于访问字段,通过Type对象的GetField或GetFields方法获取FieldInfo...

    C#反射总结,包括实例和讲解

    通过反射,你可以获取关于类型、方法、属性、事件等的详细信息,并能在运行时创建和调用它们。System.Reflection命名空间包含了用于反射的核心类,如Assembly、Type、MethodInfo、FieldInfo等。 2. **命名空间与装...

    详细的C#反射例子(项目文件)

    这个"详细的C#反射例子(项目文件)"显然包含了关于如何使用C#反射的实际应用示例,这对于理解并掌握这一核心概念至关重要。 反射允许程序员在运行时执行以下操作: 1. **获取类型信息**:通过Type类,可以获取...

    C#反射基础学习

    10. **委托与事件(Delegate.CreateDelegate)**:反射可以用来创建委托对象,从而允许动态绑定到方法。这在处理事件和回调函数时非常有用。 11. **自定义属性(Attribute)**:C#支持元数据注解,可以通过反射获取...

    泛型反射联合使用.zip

    在C#编程中,泛型和反射是两种强大的特性,它们各自有着独特的功能,并且在特定情况下可以结合使用,以实现更加灵活和高效的代码。本文将深入探讨这两个概念及其联合应用。 首先,让我们理解什么是泛型。泛型是C# ...

    C#Winform动态调用C++和C#的Dll

    本文将重点讲解如何在C#的Winform应用中动态调用C++和C#编写的DLL,并将DLL作为嵌入资源处理,避免因丢失DLL文件而引发的问题。 首先,我们需要理解DLL的工作原理。DLL文件包含可执行代码和数据,当一个应用程序...

    C#动态调用DLL并对目标函数传递参数

    在.NET框架中,C#语言提供了强大的类型安全和编译时检查,但有时我们需要在运行时动态地加载和调用DLL中的函数,这种情况通常涉及到“反射”这一核心特性。本篇将深入探讨如何使用C#进行动态DLL调用以及如何向目标...

Global site tag (gtag.js) - Google Analytics