我正在使用HandsOnTable在我的网站上使编辑数据库表更具交互性。
HandsOnTable几乎满足了我的所有要求,只是我数据库中的某些列实际存储了外键而不是本地字符串值。
在UI中,我希望这些列显示为下拉菜单,用户可以选择映射到前面提到的外键的可读值(即类似HTML名称/值select
)。
不幸的是HandsOnTable没有这样的细胞类型。最接近它的是autocomplete
。这允许我创建一个下拉列表,但它只包含值;没有相应的钥匙。以下是它的创建方式:
"source": ["Jebediah", "Bob", "Bill", "Buzz"]
所以我计划从服务器发送两个Json字符串:
包含HandsOnTable渲染表所需参数的参数:
{
"data": [
{ "ID": 1, "Description": "Crude", "Volume": 204, "Customer": "jebediah" },
{ "ID": 2, "Description": "Hidrogen", "Volume": 513, "Customer": "Bob" },
{ "ID": 3, "Description": "Coal", "Volume": '67', "Customer": "Bill" },
{ "ID": 4, "Description": "Wood", "Volume": '513', "Customer": "Buzz" }
],
"columns": [
{ "data": "ID", "type": "numeric" },
{ "data": "Description", "type": "text"},
{ "data: "Volume", "type": "numeric" },
{ "data": "color", "type": "autocomplete", "strict": "true",
"source": ["Jebediah", "Bob", "Bill", "Buzz"]}
]
}
第二个映射键到值
{
"mappings": [
{"key": 0, "value": "Jebediah"},
{"key": 0, "value": "Bob"},
{"key": 0, "value": "Bill"},
{"key": 0, "value": "Buzz"}
]
}
到目前为止一切顺利。现在是棘手的部分:
HandsOnTable有一个函数(getData()
),它允许我将表数据检索为准备好发送回服务器的Json字符串:
var jdata = myHandsOnTable.getData();
jdata看起来像这样:
"data": [
{ "ID": 1, "Description": "Crude", "Volume": 204, "Customer": "jebediah" },
{ "ID": 2, "Description": "Hidrogen", "Volume": 513, "Customer": "Bob" },
{ "ID": 3, "Description": "Coal", "Volume": '67', "Customer": "Bill" },
{ "ID": 4, "Description": "Wood", "Volume": '513', "Customer": "Buzz" }
]
现在发布之前,我想用Customer
json字符串中的匹配对键替换mappings
节点的值。
如何在JavaScript / JQuery中实现这一目标?
是否有一个功能如下?:
jdata.replaceNode('node', mappings)
由于
答案 0 :(得分:8)
我有类似的问题,这就是我做的......
对于每个外键列,我在handontable中存储了2个值;一个用于id本身,我将其设置为隐藏列,另一个是用户友好的可读文本值作为下拉列表。
每次更改下拉列表的值时,我也会更改相应的隐藏ID。在我的情况下,我在handontable外面有一个下拉列表作为过滤器,我用它来映射键/值对,但你可以使用Hashtables或其他任何东西。
现在代码......
Handsontable config :
afterChange: function (changes, source) { AfterChange(changes, source); }
更改后事件(每次表中都有更改时调用):
function AfterChange(Changes, Source) {
if (Source === 'loadData') {
return; //don't save this change
}
var rowIndex = 0, columnID = 1, oldTextVal = 2, newTextVal = 3, ntv = '', nv = '';
$(Changes).each(function () {
if (this[columnID] === 'CategoryID') {
// Do nothing...
//To make sure nothing else happens when this column is set through below
}
else if (this[columnID] === 'CategoryName') {
ntv = this[newTextVal];
//This is where I do my mapping using a dropdown.
nv = $('#CategoriesFilterDropdown option').filter(function () { return $(this).text() === ntv; }).val();
//13 is my CategoryID column
$container.handsontable('setDataAtCell', this[rowIndex], 13, nv);
}
});
}
}
这样,您可以像保存一样更改外键,而不需要在保存之前循环显示所有外键。它还可以很容易地将表数据发送回服务器。
在摘要中,
CategoryName
列(类型为autocomplete
)进行互动。CatgoryID
选项将列宽设置为0,向用户隐藏colWidths
列。CategoryName
字段更改时,请使用afterChange
事件设置相应的CategoryID
列。在我的情况下,我使用页面上其他地方的下拉列表来映射Name => ID,但您可以使用其他方式,例如哈希表。我希望它有意义......
答案 1 :(得分:1)
jExcel是另类插件,可完全支持k => v下拉菜单。您可以在以下网址找到使用条件选项的更高级演示:http://jsfiddle.net/orz8frko/3/
data = [
[3, 'Cheese'],
[1, 'Apples'],
[2, 'Carrots'],
[1, 'Oranges'],
];
$('#my').jexcel({
data:data,
colHeaders: ['Model','Color'],
colWidths: [ 300, 80 ],
columns: [
{ type: 'dropdown', source:[
{'id':'1', 'name':'Fruits'},
{'id':'2', 'name':'Legumes'},
{'id':'3', 'name':'General Food'}]
},
{ type: 'text' },
]
});

body { background-color:#eee }

<link rel="stylesheet" type="text/css" href="https://bossanova.uk/components/bossanova-ui/css/jquery.jexcel.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript" src="https://bossanova.uk/components/bossanova-ui/js/jquery.jexcel.js"></script>
<div id="my"></div>
&#13;