jqGrid - 将数据库记录嵌套属性设置为行 ID
jqGrid - Setting database record nested property as row id
在我的网格中,我配置了 jsonReader "id" 属性来获取我的数据库记录作为行 ID。
像这样:
JSON:
{
id: 1,
price: 99.99,
data: {
dataId: 2
}
}
JSON 阅读器
...
jsonReader: {
root: 'list',
total: 'count',
id: 'id'
},
...
如果我想将 "dataId" 设置为行 ID 怎么办?我试图通过在字符串中使用点符号来定义它,但它不起作用。这是我的网格选项:
var gridOptions = {
height: 250,
colNames: ['Nome', 'Preço'],
colModel: [{
name:'ipvodAsset.title',
index:'ipvodAsset.title',
width: 200,
sorttype:'string',
searchoptions: { sopt:['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc'] }
}, {
name:'price',
index:'price',
width:200,
sorttype:'currency',
formatter: 'currency',
searchoptions: { sopt:['eq','ne','gt','ge','bw','bn','cn','nc'] }
}],
jsonReader: { id: 'data.data.id' },
prmNames: {'order': 'order'},
gridView: true,
sortorder: 'asc',
sortname: 'title',
viewrecords : true,
rowNum: 10,
rowList:[10,20,30],
altRows: true,
dataType="local",
data = [
{ "id": 1, "price": 99.99, "data": { "dataId": 2 } },
{ "id": 2, "price": 99.99, "data": { "dataId": 3 } },
{ "id": 3, "price": 99.99, "data": { "dataId": 4 } },
{ "id": 4, "price": 99.99, "data": { "dataId": 5 } }
]
};
首先我要提到的是JSON和对象初始化之间存在很大差异。语法
var data = [
{ "id": 1, "price": 99.99, "data": { "dataId": 2 } },
{ "id": 2, "price": 99.99, "data": { "dataId": 3 } },
{ "id": 3, "price": 99.99, "data": { "dataId": 4 } },
{ "id": 4, "price": 99.99, "data": { "dataId": 5 } }
];
声明变量 data
并初始化它。变量 data
的类型为 object
。因为所有属性的名称 id
、price
和 data
不包含空格、点和其他特殊字符,所以可以将上面的代码重写为
var data = [
{ id: 1, price: 99.99, data: { dataId: 2 } },
{ id: 2, price: 99.99, data: { dataId: 3 } },
{ id: 3, price: 99.99, data: { dataId: 4 } },
{ id: 4, price: 99.99, data: { dataId: 5 } }
];
另一个建筑
var myJsonString = '[ { "id": 1, "price": 99.99, "data": { "dataId": 2 } }, { "id": 2, "price": 99.99, "data": { "dataId": 3 } }, { "id": 3, "price": 99.99, "data": { "dataId": 4 } }, { "id": 4, "price": 99.99, "data": { "dataId": 5 } } ]';
声明并初始化 string
类型的变量 myJsonString
(!!!)。使用 JavaScript.
的 jQuery.parseJSON or JSON.parse or even using eval 函数可以轻松地将字符串 myJsonString
转换为对象 data
因此 myJsonString
初始化右侧使用的字符串是 JSON 字符串,而不是第一个示例中的初始化器。
您发布的代码像 dataType="local"
而不是 datatype: "local"
或 gridView: true
而不是 gridview: true
。例如,如果您使用 dataType: "local"
而不是 datatype: "local"
,那么该选项将被忽略,并且将使用 datatype
的默认 "xml"
值。它不会是你需要的。
然而问题仍然存在:如何读取此类数据并从 data.dataId
.
分配 rowid 值
因为你使用了datatype: "local"
所以需要使用localReader
而不是jsonReader
:
localReader: { id: "data.dataId" }
而不是
jsonReader: { id: 'data.data.id' }
在您的代码中使用。
对应的demo是here。它显示
您可以轻松验证(使用 Chrome、Internet Explorer 或 Firefox 的开发者工具)网格的 rowids 是 2,3,4,5 而不是 1,2,3,4:
在我的网格中,我配置了 jsonReader "id" 属性来获取我的数据库记录作为行 ID。 像这样:
JSON:
{
id: 1,
price: 99.99,
data: {
dataId: 2
}
}
JSON 阅读器
...
jsonReader: {
root: 'list',
total: 'count',
id: 'id'
},
...
如果我想将 "dataId" 设置为行 ID 怎么办?我试图通过在字符串中使用点符号来定义它,但它不起作用。这是我的网格选项:
var gridOptions = {
height: 250,
colNames: ['Nome', 'Preço'],
colModel: [{
name:'ipvodAsset.title',
index:'ipvodAsset.title',
width: 200,
sorttype:'string',
searchoptions: { sopt:['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc'] }
}, {
name:'price',
index:'price',
width:200,
sorttype:'currency',
formatter: 'currency',
searchoptions: { sopt:['eq','ne','gt','ge','bw','bn','cn','nc'] }
}],
jsonReader: { id: 'data.data.id' },
prmNames: {'order': 'order'},
gridView: true,
sortorder: 'asc',
sortname: 'title',
viewrecords : true,
rowNum: 10,
rowList:[10,20,30],
altRows: true,
dataType="local",
data = [
{ "id": 1, "price": 99.99, "data": { "dataId": 2 } },
{ "id": 2, "price": 99.99, "data": { "dataId": 3 } },
{ "id": 3, "price": 99.99, "data": { "dataId": 4 } },
{ "id": 4, "price": 99.99, "data": { "dataId": 5 } }
]
};
首先我要提到的是JSON和对象初始化之间存在很大差异。语法
var data = [
{ "id": 1, "price": 99.99, "data": { "dataId": 2 } },
{ "id": 2, "price": 99.99, "data": { "dataId": 3 } },
{ "id": 3, "price": 99.99, "data": { "dataId": 4 } },
{ "id": 4, "price": 99.99, "data": { "dataId": 5 } }
];
声明变量 data
并初始化它。变量 data
的类型为 object
。因为所有属性的名称 id
、price
和 data
不包含空格、点和其他特殊字符,所以可以将上面的代码重写为
var data = [
{ id: 1, price: 99.99, data: { dataId: 2 } },
{ id: 2, price: 99.99, data: { dataId: 3 } },
{ id: 3, price: 99.99, data: { dataId: 4 } },
{ id: 4, price: 99.99, data: { dataId: 5 } }
];
另一个建筑
var myJsonString = '[ { "id": 1, "price": 99.99, "data": { "dataId": 2 } }, { "id": 2, "price": 99.99, "data": { "dataId": 3 } }, { "id": 3, "price": 99.99, "data": { "dataId": 4 } }, { "id": 4, "price": 99.99, "data": { "dataId": 5 } } ]';
声明并初始化 string
类型的变量 myJsonString
(!!!)。使用 JavaScript.
myJsonString
转换为对象 data
因此 myJsonString
初始化右侧使用的字符串是 JSON 字符串,而不是第一个示例中的初始化器。
您发布的代码像 dataType="local"
而不是 datatype: "local"
或 gridView: true
而不是 gridview: true
。例如,如果您使用 dataType: "local"
而不是 datatype: "local"
,那么该选项将被忽略,并且将使用 datatype
的默认 "xml"
值。它不会是你需要的。
然而问题仍然存在:如何读取此类数据并从 data.dataId
.
因为你使用了datatype: "local"
所以需要使用localReader
而不是jsonReader
:
localReader: { id: "data.dataId" }
而不是
jsonReader: { id: 'data.data.id' }
在您的代码中使用。
对应的demo是here。它显示
您可以轻松验证(使用 Chrome、Internet Explorer 或 Firefox 的开发者工具)网格的 rowids 是 2,3,4,5 而不是 1,2,3,4: