首页 新闻 会员 周边 捐助

关于JS,在for循环里使用switch产生的问题(easyui)

0
[已解决问题] 解决于 2013-11-25 13:26
$.post("/EasyUI/actionInfo", {}, function (data) {
                for (var i = 0; i < data.length; i++) {
                    {
                        var item = data[i];
                        $("#dg").datagrid("addToolbarItem", [{ "text": item.ActionName, "iconCls": item.Icons, "handler": function () {
                          
                                switch (item.ActionName) {
                                    case '添加': alert("添加");
                                        break;
                                    case '修改': alert("修改");
                                        break;
                                    case '删除': alert("删除");
                                        break;
                                    default: alert("ddd");
                                
                            }
                        }
                        }, "-"]);
                    }
                }
            })

先解释一下上面代码的功能:

$("#dg").datagrid("addToolbarItem",[{text:按钮名称,iconCls:按钮图标,handler:点击按钮的事件}]);
通过异步获取数据库的信息,然后通过该方法动态添加datagrid表格的按钮。


出现的问题:
问题就出现【handler】点击事件上面,当上面代码执行后,产生的所有按钮的点击事件都是循环时最后一个事件,也就是说假如循环到最后一个删除按钮,它的事件应该是alert("删除"),但是循环完毕后,所有按钮的事件都是alert("删除"),用断点跟踪了一下,就是最后一次执行后,覆盖了曾经全部的事件。
其实我想实现的功能就是动态的添加datagrid表格的按钮。
不好意思,没豆了,本来申请了新号,但是不能提问。
如果有朋友做过类似的功能,也可以借鉴一下。
only-time的主页 only-time | 初学一级 | 园豆:4
提问于:2013-11-25 03:30
< >
分享
最佳答案
0

改成这样:

var item = data[i];

switch (item.ActionName)

{ case '添加':$("#dg").datagrid("addToolbarItem", [{ "text": item.ActionName, "iconCls": item.Icons, "handler": function () {alert("添加");})

……

奖励园豆:5
junjieok | 小虾三级 |园豆:779 | 2013-11-25 08:01

这样写其实还是不行的,曾经测试过,如果把handler里的方法换成带有变量的方法时,也就是alert(item.ActionName),还是会有同样的问题。

only-time | 园豆:4 (初学一级) | 2013-11-25 12:44

@only-time: handler处理的代码段定义成一个function改成如下:

ar item = data[i];

switch (item.ActionName)

{ case '添加':$("#dg").datagrid("addToolbarItem", [{ "text": item.ActionName, "iconCls": item.Icons, "handler": function () {handlerFn(item.ActionName);})

……

 

function handlerFn(actionName)

{

alert(actionName);

}

junjieok | 园豆:779 (小虾三级) | 2013-11-25 12:56

@junjieok: 还是谢谢朋友的回答, 通过搜索,最终发现遇到的是闭包的问题,现在得以解决。

only-time | 园豆:4 (初学一级) | 2013-11-25 13:11

@junjieok: 呵呵,这种方法我也测试过,依然还是同样的结果,这种问题都是闭包产生的。

only-time | 园豆:4 (初学一级) | 2013-11-25 13:12

@only-time: 的的确确是闭包的问题

junjieok | 园豆:779 (小虾三级) | 2013-11-25 13:24

@only-time: "handler": function (actionName) {

function()

{

  alert(actionName);

};

}(item.ActionName);

这样就行了,很长时间没看了,忘记闭包的东西了

junjieok | 园豆:779 (小虾三级) | 2013-11-25 22:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册