我的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次。
不确定我哪里错了?请帮助。
答案 0 :(得分:2)
您似乎是JavaScript语言的新手。大多数人都是从另一种语言开始,后来必须使用JavaScript语言。问题是JavaScript语言与C ++ / C#或Java完全不同,它可能是您当前最喜欢的语言。我严格建议您更改JavaScript代码的样式。不要使用与您喜欢的其他语言相同的风格。
首先,您应该遵循JavaScript语言标准的名称转换。您可以在问题文本中看到OnComplete
,OnFail
或ValueListArray
的另一种颜色为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;
}
});
}