日期:2014-05-16  浏览次数:20341 次

关于ext怪异问题:为何我点击不同的对象,得到的值都是一样的?
先看代码如下:
JScript code

    var panel = Ext.create("Ext.panel.Panel");
    var arraytest = ["a","b"];
    
    
    function test(p){
        alert(p);//测试时不管点a,还是b,都是提示b,这不是我想要的
    }        
    
    
    for (var i = 0; i < arraytest.length; i++){
        alert(arraytest[i]);
        var tmp = arraytest[i];
        
        var testText = 
        {
             xtype: "tbtext",
             text: "点此测试:"+tmp,//分别得到两个文本:点此测试a与点此测试b
            listeners: 
            {
                click: {
                    element: "el",
                    fn: function(){ 
                        test(tmp);//当i=0时,tmp="a",当i=1时,tmp="b",分别点击时,应该分别提示a与b ,但是,怪异的是,不管点那个点此测试a或点此测试b,提示的都是为b,而我想要的效果是,点击“此测试a”时,提示a,“点此测试b”时,提示b,怎么解决?
                    }
                }
            }
        }            
        
        panel.add(testText);        
    }




代码里边有说明了,我再补充下,就是我要实现的效果是点击点此测试a时,要提示a,测试的结果每次都提示b,为什么会这样呢?tmp值不是每循环都不同吗?并且还是局部变量,为什么最终都变成b了呢,如何解决这个问题?请大虾指点,解决问题后,最好还要分析下原因,谢谢

------解决方案--------------------
你犯了一个较老的错误,这个错误类似下面的例子。
JScript code

var a=[];
for(var i=0;i<3;i++)a.push(function(){alert(i)});
a[0]();

------解决方案--------------------
ext4不熟,针对你的问题,用函数委托:
JScript code

for (var i = 0; i < arraytest.length; i++){
        testText=function(tmp){
            return {
                xtype: "tbtext",
                text: "点此测试:"+tmp,//分别得到两个文本:点此测试a与点此测试b
                listeners: 
                {
                    click: {
                        element: "el",
                        fn: function(){ 
                            test(tmp);//当i=0时,tmp="a",当i=1时,tmp="b",分别点击时,应该分别提示a与b ,但是,怪异的是,不管点那个点此测试a或点此测试b,提示的都是为b,而我想要的效果是,点击“此测试a”时,提示a,“点此测试b”时,提示b,怎么解决?
                        }
                    }
                }
            }
        }(arraytest[i]);
        panel.add(testText);          
    }

------解决方案--------------------
for (var i = 0; i < arraytest.length; i++){
alert(arraytest[i]);
var tmp = arraytest[i];

var testText = 
{
xtype: "tbtext",
text: "点此测试:"+tmp,
myvalue: tmp, 
listeners:
{
click: {
fn: function (obj) {
alert(obj.myvalue);
}
}
}
}
}
panel.add(testText);
}
------解决方案--------------------
闭包没做好。。
JScript code
var testText = {
   xtype: "tbtext",
   text: "点此测试:" + tmp, //分别得到两个文本:点此测试a与点此测试b
   listeners: {
   click: {
      element: "el",
      fn: (function (tmp) {
           return function () {/////这里做个闭包,生成一个新函数引用父函数的变量tmp
                  test(tmp);
           }
       })(tmp)///
    }
}