`

【转】Js中 scope和createDelegate()

阅读更多

关于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还有其他功能,比如修改调用参数等。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liu78778/archive/2010/01/30/5271875.aspx

分享到:
评论

相关推荐

    深入浅出Ext JS(资料)

    关于scope和createDelegate()的知识点,它们是JavaScript中作用域和函数绑定的概念。在Ext JS中,开发者经常需要使用回调函数来处理异步操作的结果,而正确的函数作用域能够确保回调函数在适当的上下文中被调用。...

    extjs数据存储与传输详解

    ### 九、关于scope和createDelegate() **scope**是指在回调函数中this关键字所指向的对象。**createDelegate()**方法则是用来创建一个新的函数,该函数在执行时可以指定特定的作用域(即scope)。这对于在回调函数...

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

    在这个案例中,`HtmlEditorImageInsert.js`是实现这一功能的核心脚本。这个文件中通常会定义一个新的EXT插件,这个插件会在Htmleditor的工具栏上创建一个按钮,点击该按钮时,用户可以选择本地图片并将其插入到编辑...

    ExtJS 事件笔记

    - **Ext.EventManager**:ExtJS的事件管理策略封装在这个单体类中,负责跨浏览器的兼容性处理和事件处理函数的维护。 - **Ext.lib.Event**:处理底层的跨浏览器兼容性问题。 - **创建代理函数**:使用`...

    常用Extjs工具:Extjs.util.Format使用方法

    通过这些方法,开发者可以在Extjs应用中更加灵活地处理数据格式化问题,提高开发效率和代码的可维护性。需要注意的是,由于使用OCR技术对文档进行文字扫描可能造成个别字识别错误或遗漏,实际应用时可能需要结合上...

    Ext对基本类型的扩展 ext,extjs,format

    - `createDelegate` 方法与`createCallback`类似,但允许指定一个作用域(`scope`),从而改变函数的`this`上下文。 - `createInterceptor` 方法用于创建一个拦截函数,在调用原始函数之前首先调用该拦截函数。如果...

Global site tag (gtag.js) - Google Analytics