在$ .each()语句中循环

时间:2014-07-17 15:49:24

标签: jquery ajax jqgrid each

我的result里面有5个项目。现在在某些条件下,我必须将这些项目推送到数组中,并将其作为列和行绑定在jqgrid中。所以我必须循环到结果(类似的东西)。我该怎么办?

//代码:

var colname = [];
    var colHeader = [];

    $.ajax({
        url: '@(Url.Action("LoadColumns", "Home"))',
        datatype: 'json',
        mtype: 'GET',
        success: OnComplete,
        error: OnFail
    });
    function OnComplete(result) {
        var i = 0;
        $.each(result, function () {
            console.log(result.rows[i]);
           var currentRow = result.rows[i];
           colHeader.push(currentRow.Name);
          // alert(currentRow.Name);
           switch (currentRow.Datatype) {

                case 'int':
                    colname.push({ name: currentRow.Name, index: currentRow.Name, width: 200, align: 'left', sortable: true, editable: false, sorttype: 'int' });
                    break;
                case 'String':
                    colname.push({ name: currentRow.Name, index: currentRow.Name, width: 200, align: 'left', sortable: true, editable: true });
                    break;
                case 'DateTime':
                    colname.push({
                        name: currentRow.Name, index: currentRow.Name, width: 200, align: 'left', sortable: true, editable: true, sorttype: 'date',
                        formatter: 'date', formatoptions: { newformat: 'm-d-Y' }, datefmt: 'm-d-Y'
                    });
                    break;
                case 'dropdown':
                    if (currentRow.ValueList != null && currentRow.ValueList != '') {
                        var ValueListArray = currentRow.ValueList.split(" ");
                        var valueListItems = '';
                        $.each(ValueListArray, function (index, values) {
                            valueListItems = valueListItems + values + ":" + values + ";";
                        });
                    }
                    colname.push({
                        name: currentRow.Name, index: currentRow.Name, width: 200, edittype: "select", formatter: 'select',
                        editoptions: { value: valueListItems.slice(0, -1) }, stype: 'select'
                                , searchoptions: { value: ':All;' + valueListItems.slice(0, -1) }, align: 'left', sortable: true, editable: true
                    });
                    break;

            }

            i++;
        });
}

当我尝试我只得到一个值打印11次。

不确定我哪里错了?请帮助。

2 个答案:

答案 0 :(得分:2)

您似乎是JavaScript语言的新手。大多数人都是从另一种语言开始,后来必须使用JavaScript语言。问题是JavaScript语言与C ++ / C#或Java完全不同,它可能是您当前最喜欢的语言。我严格建议您更改JavaScript代码的样式。不要使用与您喜欢的其他语言相同的风格。

首先,您应该遵循JavaScript语言标准的名称转换。您可以在问题文本中看到OnCompleteOnFailValueListArray的另一种颜色为i变量。原因:具有第一个大写字母的变量名称仅用作对象的构造函数。所以一个人使用

var d = new Date();
例如,

代替var d = Date();

以同样的方式,你不应该总是尝试在C#中使用你可能喜欢的foreach构造。当前版本的JavaScript没有该构造。所以

的用法
var i, rows = result.rows, n = rows.length, item;
for (i = 0; i < n; i++) {
    item = rows[i];
    // now you can work with item
}

使用$.each的速度要快得多。您可以看到我将rows属性(result.rows)的值保存在变量中,并将rows.length保存在下一个变量中,而不是直接在{{1中使用rows.length循环。它也提高了性能,因为不要优化代码。可能是for数组的大小会发生变化,甚至rows属性将被length正文中的自定义实现覆盖。因此,JavaScript不会进行任何代码优化,并且在变量中保存未更改的属性值将提高性能。

即使使用for函数的外部范围中定义的colHeader变量,也可以使用局部变量OnComplete。可能你可以在colHeader内完成所有工作(在循环OnComplete之后)?当前代码会生成$.each closure。它以其他方式工作,就像你在C#中所熟知的那样。所以我建议你把时间花在研究JavaScript语言上。之后我决定为我做这个的论点是JavaScript没有块级变量而是使用函数级变量。如果一个人不明白,那么你可以编写和阅读代码,这些代码将以您认为的另一种方式由JavaScript解释。有关详细信息,请参阅the answer

关于代码的另一个评论

OnComplete

和其他近线。 jqGrid没有任何数据类型。另一方面,可以使用列模板(请参阅the answer),这可以使您的代码更短,更易读。

答案 1 :(得分:0)

得到了答案,做了类似的事。

//代码:

 var colname = [];
    var colHeader = [];

    $.ajax({
        url: '@(Url.Action("LoadColumns", "Home"))',
        datatype: 'json',
        mtype: 'GET',
        success: OnComplete,
        error: OnFail
    });
    function OnComplete(result) {

        $.each(result.rows, function (inx,val) {

           colHeader.push(this.Name);

           switch (this.Datatype) {

                case 'int':
                    colname.push({ name: this.Name, index: this.Name, width: 200, align: 'left', sortable: true, editable: false, sorttype: 'int' });
                    break;
                case 'String':
                    colname.push({ name: this.Name, index: this.Name, width: 200, align: 'left', sortable: true, editable: true });
                    break;
                case 'DateTime':
                    colname.push({
                        name: this.Name, index: this.Name, width: 200, align: 'left', sortable: true, editable: true, sorttype: 'date',
                        formatter: 'date', formatoptions: { newformat: 'm-d-Y' }, datefmt: 'm-d-Y'
                    });
                    break;
                case 'dropdown':
                    if (this.ValueList != null && this.ValueList != '') {
                        var ValueListArray = this.ValueList.split(" ");
                        var valueListItems = '';
                        $.each(ValueListArray, function (index, values) {
                            valueListItems = valueListItems + values + ":" + values + ";";
                        });
                    }
                    colname.push({
                        name: this.Name, index: this.Name, width: 200, edittype: "select", formatter: 'select',
                        editoptions: { value: valueListItems.slice(0, -1) }, stype: 'select'
                                , searchoptions: { value: ':All;' + valueListItems.slice(0, -1) }, align: 'left', sortable: true, editable: true
                    });
                    break;

            }


        });
}