日期:2014-05-16 浏览次数:20328 次
关于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) { ?