javascript - 如何在js中使用javascript中的外部值创建循环中的对象?

标签 javascript jquery jqgrid

我想动态制作一个 jqgrid 列。但我面临一个问题“在外部作用域循环中修改的变量的闭包”。这是我返回 jqgrid 的 colModel 的函数。

 var getJqgridColModel = function () {
            var colModel = [
            ];
           //Here i am making the column
            if (args && args.colModel) {

                for (var i = 0; i < args.colModel.length; i++) {

                    var col = {
                        name: "action",
                        width: "100",
                        sortable: false,
                        hidden: false,

                        formatter: function(cellValue, options, rowObject) {
                            var markup = "<a class=\"jqGrid-Column-Text\" title=\"%ToolTip%\" href=%Href%;>%Text%</a>";
                            var replacements = {
//Here is problem
                                "%Text%": args.colModel[i].actionLink,//Problem occures here.This "args.colModel[i].actionLink" is not recoginize.It shows "closure on a variable modified in loop of outer scope"
                                "%ToolTip%": "//",
                                "%Href%": "javascript:PersonSearch.perfomeActionOnSelect(" + rowObject.PersonLog.PersonId + ")"
                            };

                            markup = markup.replace(/%\w+%/g, function(all) {
                                return replacements[all];
                            });
                            return markup;
                        }
                    };
                    colModel.push(col);
                }

            }

            return colModel;
        }

我该如何解决这个问题?

最佳答案

您原来的示例不起作用的原因是您在循环中创建的所有闭包都引用了同一帧。

    var getJqgridColModel = function () {
    var colModel = [];
    //Here i am making the column
    if (args && args.colModel) {
                for (var i = 0; i < args.colModel.length; i++) {

                    var col = {
                        name: "action",
                        width: "100",
                        sortable: false,
                        hidden: false,

                        formatter: (function(i){
                            return function(cellValue, options, rowObject) {
                                var markup = "<a class=\"jqGrid-Column-Text\" title=\"%ToolTip%\" href=%Href%;>%Text%</a>";
                                var replacements = {
                                    //Here is problem
                                    "%Text%": args.colModel[i].actionLink,//Problem occures here.This "args.colModel[i].actionLink" is not recoginize.It shows "closure on a variable modified in loop of outer scope"
                                    "%ToolTip%": "//",
                                    "%Href%": "javascript:PersonSearch.perfomeActionOnSelect(" + rowObject.PersonLog.PersonId + ")"
                                };

                                markup = markup.replace(/%\w+%/g, function(all) {
                                        return replacements[all];
                                });
                                return markup;
                            }
                        }(i));
                    };
                    colModel.push(col);
                }

        }

        return colModel;
}

关于javascript - 如何在js中使用javascript中的外部值创建循环中的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35938178/

相关文章:

javascript - 以更短的方式从数组中获取字符串

jquery - JqG​​rid 在 jquery 对话框中显示为不可编辑的模式

jqgrid - 如何在jqgrid的同一列中显示多个值

javascript - 递归 ngInclude

javascript - 下拉菜单第二个链接在悬停时消失

javascript - 在不知道其父元素的情况下删除 dom 元素?

javascript - Dragdealer 初始化

jqGrid列日期时间格式

javascript - 使用 + 和 - 图标折叠/展开表格

javascript - 更改宽度时叠加的图像会闪烁