`
tangwenchao86
  • 浏览: 381905 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

scope与createDelegate

    博客分类:
  • IT
阅读更多
关于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中,实现过程如代码清单10-6所示。

代码清单10-6 Ajax中使用回调函数
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。

l    为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对它进行操作了。

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

一个实例的源码见附件。
分享到:
评论

相关推荐

    extjs数据存储与传输详解

    **createDelegate()**方法则是用来创建一个新的函数,该函数在执行时可以指定特定的作用域(即scope)。这对于在回调函数中保持正确的上下文非常有用。 ### 十、DWR与EXT整合 **Direct Web Remoting (DWR)**是一种...

    ExtJS 事件笔记

    - 通过`scope`参数指定作用域。 - 使用`Function.prototype.createDelegate`创建具有指定作用域的代理函数。 - `call`和`apply`方法可以改变`this`的值,但会立即执行函数,而`createDelegate`则不会。 总的来说...

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

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

    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 ...

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

    - createInterceptor(fun, scope):为函数设置拦截器,拦截器会在原函数执行之前运行。只有当拦截器返回true时,原函数才会执行。这种方式类似于面向切面编程(AOP)中的切面概念。 例如,对于拦截器的使用,如果有...

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

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

Global site tag (gtag.js) - Google Analytics