1.call是js自带的方法,长在Function对象上
function b(v){
alert(this.temp+" "+v);
}
b.call({temp:'abc'},'hello');
第一个参数是给b function的this作用域赋值,后面那个是b 的参数
2.createDelegate()是Ext自己扩展的方法,同样是长在Function对象上的,这个方法的作用是返回一个匿名方法的引用,通常用来改变作用域
function b(v){
alert(this.temp+" "+v);
}
Function.prototype.createDelegate=function(scope,params){
var _fun = this;
return function(){
_fun.apply(scope,params);
};
}
var fun = b.createDelegate({temp:'abc'},['hello']);
fun();
关于回调函数指定参数问题,由来已久,extjs简洁优雅完美的解决了这个问题,今天来学习一下(不推荐 createCallback
)
createDelegate ( [Object obj ] , [Array args ] , [Boolean/Number appendArgs ] ) : Function
返回一个函数, 这个函数调用原函数,原函数中的this指向obj ,关于这个函数的参数由 appendArgs 指定 :
如 function2=function1.createDelegate(obj,args,appendArgs);
function2 call function1 ,function1 中的 this == obj
1. appendArgs falsy
那么 调用
function2时传的参数被忽略,args数组参数作为function1的参数运行。
2. appendArgs === true
那么
调用
function2时传的参数放在args数组前面合成一个新的数组,作为function1的参数运行。
3.typeof appendArgs == 'Number'
假设 调用 function2时传的参数 为 array1 (注意要 slice 为 真正的 Array)
那么将 args 数组插入到 array1 的指定 appendArgs位置 (利用 splice( appendArgs,0 ))
然后再把最终数组 作为function1的参数运行。
示例使用代码:
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
<
html
xmlns
=
"http://www.w3.org/1999/xhtml"
lang
=
"en"
xml:lang
=
"en"
>
-
<
head
>
-
<
title
>
createDelegate测试
</
title
>
-
-
<
script
type
=
"text/javascript"
src
=
"javascript/ext-base.js"
>
</
script
>
-
<
script
type
=
"text/javascript"
src
=
"javascript/ext-core.js"
>
</
script
>
-
-
-
-
<
script
type
=
"text/javascript"
>
-
//<![CDATA[
-
-
Ext.onReady(function() {
-
function action_ba(info) {
-
alert(this.dom.innerHTML);
-
alert(info);
-
}
-
-
function action_bb(e,this_,o,info) {
-
alert(this.dom.innerHTML);
-
alert(e.type+' '+info);
-
}
-
-
function action_bc(info,e) {
-
alert(this.dom.innerHTML);
-
alert(info +' '+e.type);
-
}
-
-
Ext.get('action_a').on('click',action_ba.createDelegate(Ext.get('action_a'),['自定义参数覆盖event系列参数']));
-
-
Ext.get('action_b').on('click',action_bb.createDelegate(Ext.get('action_b'),['自定义参数在最后'],true));
-
-
Ext.get('action_c').on('click',action_bc.createDelegate(Ext.get('action_c'),['自定义参数在第一位'],0));
-
-
});
-
//]]>
-
-
</
script
>
-
-
</
head
>
-
<
body
>
-
-
<
button
id
=
'action_a'
>
测试覆盖参数
</
button
>
-
<
button
id
=
'action_b'
>
测试添加参数
</
button
>
-
<
button
id
=
'action_c'
>
测试插入参数
</
button
>
-
-
-
-
-
-
-
-
</
body
>
-
</
html
>
附录:Extjs 实现代码
-
Function.prototype.createDelegate =
function
(obj, args, appendArgs){
-
var
method =
this
;
-
return
function
() {
-
var
callArgs = args || arguments;
-
if
(appendArgs ===
true
){
-
callArgs = Array.prototype.slice.call(arguments, 0);
-
callArgs = callArgs.concat(args);
-
}else
if
(
typeof
appendArgs ==
"number"
){
-
callArgs = Array.prototype.slice.call(arguments, 0);
-
-
var
applyArgs = [appendArgs, 0].concat(args);
-
-
Array.prototype.splice.apply(callArgs, applyArgs);
-
-
}
-
return
method.apply(obj || window, callArgs);
-
};
-
}
分享到:
相关推荐
本教程将深入讲解如何在EXT Htmleditor的工具栏中添加一个插入图片的功能按钮,并拓展讨论EXT Htmleditor的其他自定义可能性。 首先,我们来理解EXT Htmleditor的基本结构。Htmleditor是一个基于IFrame的组件,它...
2. **Ext.Element**:`Ext.Element`是EXT JS中的核心DOM操作类,它封装了对HTML元素的常见操作,如选择、遍历、样式设置、尺寸调整等。`Ext.get`和`Ext.fly`方法用于获取Element实例,`Ext.query`则类似于jQuery的`$...
7. **Ext.Element类**:这是EXT中的核心DOM操作类,提供了丰富的DOM操作方法,如`get`、`setStyle`、`on`等。 8. **Ext.DomQuery类**:EXT的CSS选择器引擎,类似于jQuery的Sizzle,可以高效地选取DOM元素。 9. **...
10.8 EXT中的Ajax .........................................246 10.8.1 最容易看到的Ext.Ajax ........246 10.8.2 Ext.lib.Ajax是更底层的封装....247 10.9 关于scope和createDelegate() ....247 10.10 DWR与EXT...
- `createDelegate` 方法与`createCallback`类似,但允许指定一个作用域(`scope`),从而改变函数的`this`上下文。 - `createInterceptor` 方法用于创建一个拦截函数,在调用原始函数之前首先调用该拦截函数。如果...
此外,**Ext.data.Connection**还提供了一个`abort`方法,用于取消正在进行中的请求。例如,当有多个请求并发执行时,可以根据事务ID取消特定的请求。 ### 三、Ext.data.Record **Ext.data.Record**是用来表示数据...
Extjs.util.Format是Extjs框架中用于格式化不同类型数据的工具集合,它包含了一系列静态方法来处理字符串、日期以及扩展函数操作。 首先,来看字符串处理方法: - capitalize(str):此方法可以将传入的字符串首字母...
- **组件事件**:对于Ext.Component的事件,Ext3.0引入了`mon`方法,可以有效防止内存泄露,如`this.mon(this.el, 'click', this.click, this)`。 - **Ext.EventManager**:ExtJS的事件管理策略封装在这个单体类中...
在这个例子中,`Ext.Ajax.request`是ExtJS用于发送Ajax请求的核心方法。`url`属性指定了后台处理的地址,`params`对象包含了要传递给后台的参数。`success`和`failure`回调函数分别处理后台操作成功或失败时的响应。...
为了实现在加载页面时只展开第一个分组,可以结合使用 `startCollapsed` 属性和其他方法。 1. **设置所有分组默认折叠**:通过将 `startCollapsed` 设置为 `true` 来实现。 2. **展开第一个分组**:可以在加载后...